首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

畢業設計實戰:簡易網絡協議分析器開發日誌(三)

     編輯:關於C語言

項目現狀

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

設備信息對話框

遇到的關鍵問題與解決

1. 動態修改對話框標題

需在運行時根據選中設備名設置彈出對話框 Caption。


BOOL CDevStatus::OnInitDialog() {
    CDialog::OnInitDialog();
    this->SetWindowTextA(CPublic::DevName); // 全局變量傳遞設備名
    return TRUE;
}

SetWindowTextA 直接作用於窗口文本,CPublic::DevName 為全局字符串。

2. MFC 跨對話框數據共享:全局類方案

兩個對話框需共享設備名、句柄等數據。採用專用全局類 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;。
**反思**:全局變量耦合度高,後續考慮改為「文檔/視圖架構」或「單例服務類」傳遞共享上下文。

3. 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 重載運算符,避免手動轉換。

4. 純淨環境部署:靜態鏈接 MFC

答辯可能需在無 VS 運行庫的機器運行。方案:項目屬性 → General → Use of MFC → **Use MFC in a Static Library**。

靜態鏈接設置

  • 優點:無需分發 MFCxx.dll/MSVCRT.dll,單 EXE 即可運行。
  • 缺點:體積膨脹(從百 KB 變數 MB),啟動稍慢。
  • 補充:/MT (靜態 CRT) 與 MFC 靜態庫需配合,否則鏈接衝突。

5. SetWindowText 系列函數的 A/W 後綴

VS2008 智能提示顯示 SetWindowTextA/SetWindowTextW:

  • A = ANSI 版(char*),W = Unicode 版(wchar_t*)。
  • 無後綴 SetWindowText 為宏,根據項目 **Character Set** 設置(Unicode/Multi-Byte)展開為對應版本。
  • 項目屬性 → Advanced → Character Set:**Use Unicode Character Set** 為現代標準,所有字符串字面量加 _T() 或 L""。

待解決項

  • 數據包解析邏輯(TCP/UDP/ICMP/HTTP 等協議樹)。
  • 抓包線程與 UI 線程解耦(生產者-消費者隊列)。
  • 過濾器語法解析(BPF / Wireshark-like 顯示過濾)。
  • 十六進制/ASCII 雙視圖數據窗口。

心得

博客發布時內容丟失一度讓人崩潰(Chrome 兼容性?),改用 Firefox 重寫。開發中「小問題」往往藏著大坑(如 CString 比較、靜態鏈接),唯有「動手調試 + 記錄總結」才能沉澱為經驗。趕進度同時,不放過任何一個 Warning 與異常行為。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved