MFC 程序在插入加密狗(硬件鎖)時正常顯示按鈕圖片,拔除硬件後按鈕圖片消失,界面異常。
CONTROL "xxx", IDC_xxx, "Vendor.Control.1", ...(ActiveX)。CWnd 但調用 InvokeHelper(OLE 自動化)。// 典型問題代碼模式
void CMyDlg::OnInitDialog() {
// ...
if (!hardwareDetect()) { // 硬件檢測
m_btnSpecial.ShowWindow(SW_HIDE); // 直接隱藏
// 或控件內部自動隱藏
}
}
| 方案 | 適用場景 | 實施難度 |
|---|---|---|
| 聯繫硬件廠商獲取無加密版 SDK/控件 | 合法授權用戶,開發調試階段 | 低(需廠商配合) |
| 使用虛擬加密狗/模擬器 | 開發測試環境 | 中(需破解/模擬工具) |
| 修改代碼繞過檢測(僅調試) | 擁有源碼權限,內部測試 | 高(需逆向/修改邏輯) |
| 替換為標準 MFC 控件 (CButton/CBitmapButton) | 不依賴硬件特有功能時 | 低(重寫 UI 邏輯) |
// 包裝硬件調用,失敗時降級而非崩潰/隱藏
bool SafeHardwareCall() {
try {
return HardwareSDK::DetectDevice();
} catch (...) {
return false; // 記錄日誌
}
}
void CMyDlg::UpdateUIForHardware() {
bool hasHardware = SafeHardwareCall();
m_btnSpecial.EnableWindow(hasHardware); // 僅禁用,不隱藏
if (!hasHardware) {
m_btnSpecial.SetWindowText(_T("需插入加密狗")); // 友好提示
}
}
IHardwareService,實現類處理具體 SDK 調用。按鈕圖片隨硬件插拔消失,本質是第三方硬件相關控件內部邏輯導致。解決核心在於確認控件來源、聯繫廠商獲取支持、或重構為標準控件,避免業務邏輯與硬件檢測強耦合。