距上次更新兩天,今日完成「設備信息顯示」模塊。界面如下:

需在運行時根據選中設備名設置彈出對話框 Caption。
BOOL CDevStatus::OnInitDialog() {
CDialog::OnInitDialog();
this->SetWindowTextA(CPublic::DevName); // 全局變量傳遞設備名
return TRUE;
}
SetWindowTextA 直接作用於窗口文本,CPublic::DevName 為全局字符串。
兩個對話框需共享設備名、句柄等數據。採用專用全局類 CPublic:
// Public.h
#pragma once
#include "pcap.h"
class CPublic : public CWnd {
DECLARE_DYNAMIC(CPublic)
public:
CPublic(); virtual ~CPublic();
static CString DevName; // 選中設備名
protected:
DECLARE_MESSAGE_MAP()
};
// Public.cpp
CString CPublic::DevName = _T("");
調用處:CPublic::DevName = selectedDev; / str = CPublic::DevName;。
**反思**:全局變量耦合度高,後續考慮改為「文檔/視圖架構」或「單例服務類」傳遞共享上下文。
CString 與 char* 比較陷阱遍歷 pcap_if_t 鏈表匹配設備描述:
for (d = alldevs; d != NULL; d = d->next) {
// 錯誤寫法:強轉導致比較失敗
// if (d->description == (LPCTSTR)CPublic::DevName)
// 正確:CString 重載了 == 比較 char*
if (d->description == CPublic::DevName)
break;
}
原因:CString::operator==(const char*) 內部執行字符串內容比較;強轉 LPCTSTR 可能導致臨時對象構造/編碼轉換語義改變,引發誤判。
**教訓**:信任 CString 重載運算符,避免手動轉換。
答辯可能需在無 VS 運行庫的機器運行。方案:項目屬性 → General → Use of MFC → **Use MFC in a Static Library**。

MFCxx.dll/MSVCRT.dll,單 EXE 即可運行。SetWindowText 系列函數的 A/W 後綴VS2008 智能提示顯示 SetWindowTextA/SetWindowTextW:
A = ANSI 版(char*),W = Unicode 版(wchar_t*)。SetWindowText 為宏,根據項目 **Character Set** 設置(Unicode/Multi-Byte)展開為對應版本。_T() 或 L""。博客發布時內容丟失一度讓人崩潰(Chrome 兼容性?),改用 Firefox 重寫。開發中「小問題」往往藏著大坑(如 CString 比較、靜態鏈接),唯有「動手調試 + 記錄總結」才能沉澱為經驗。趕進度同時,不放過任何一個 Warning 與異常行為。