系統包含兩個核心動態庫:CA.dll(數字證書管理)與 EVP.dll(加解密操作),上層應用通過 MFC 界面調用。採用 Access 數據庫存儲證書信息,SSL 實現安全通訊,非阻塞 Socket 保證並發性能。
參考《Winsock 編程寶典》(林軍鼐),FD_WRITE 與 FD_READ 事件處理是難點:
send() 返回 WSAEWOULDBLOCK(10035) 時必須停止發送,等待 FD_WRITE 通知後繼續。recv() 讀取,否則後續數據到達不再通知。錯誤處理模式:發送循環中檢查返回值,遇到 10035 註冊 FD_WRITE 等待;接收端收到 FD_READ 立即 recv() 直到返回 0 或錯誤。
長時間加解密操作需在主界面顯示進度條。採用靜態回調函數解決 DLL 無法直接訪問主窗口控件的問題:
// 主程序定義
static void DrawProg(int i);
void CUsbEvpPage::DrawProg(int i) {
((CUsbEvpPage*)((CPropertySheet*)AfxGetMainWnd())->GetPage(8))->m_Progress.SetPos(i);
}
// DLL 中調用
extern void DrawProg(int); // 聲明
DrawProg(progress); // 定期調用報告進度
關鍵點:回調函數必須為 static 或全局函數,避免 this 指針跨模塊失效。
作者建議使用 SMARTCHK 等工具檢測內存洩漏。已知問題:
數字證書、SSL 協議、OpenSSL API 使用可參考 中國 OpenSSL 論壇 及官方文檔。感謝論壇版主們的無私分享。