Posted on 2006-04-14 16:13
奔跑的阿甘 閱讀(4346)
評論(2) 編輯 收藏 引用 所屬分類:
SDK/MFC
在MFC中使用OCX控件遇到的一個問題
[問題:]
在一個簡單的MFC對話框中嵌入一個OCX控件(如瀏覽器控件),該控件采用動態方式創建,即調用CWnd::Create()接口生成窗口,在本機運行良好,但是在其它部分機器上運行則出現程序異常,報告occsite.cpp的第161行出現錯誤。當把源程序放到目標機器上重新編譯后程序可以正常運行。以下是示例代碼:
m_pFlashPlayer = NULL;? // 一個FLASH控件的對象指針
CRect rt;
GetClientRect(&rt);? //獲得區域大小
if (m_pFlashPlayer = new CShockwaveFlash) {? // CShockwaveFlash由FLASH控件添加到PROJECT后 VC自動生成
?if (m_pFlashPlayer->Create("PP", WS_VISIBLE , rt, this, 0)) {? //創建窗口
? m_pFlashPlayer->SetMovie(str);
? m_pFlashPlayer->Play();
?}
}
這個問題帶來的后果是如果要發布該程序到100臺機器上,則必須要在100臺機器上重新編譯一遍程序才能正確執行。
[分析:]
經過測試,發現:
1)該問題只存在于程序DEBUG版本中,在RELEASE版本中不存在該問題。
2)該問題和MFC有關,和所嵌入的控件本身沒有任何關系。
經過深入分析,發現:該問題是由于開發機和目標機使用的MFCO42D.DLL庫不匹配引起的。
[結果:]
經過確認,發現開發機和目標機的運行環境有如下差異:開發機未安裝任何VS補丁,MFCO42D庫的File Version為6.0.8168.0, Product Version為 6.0.000,而目標機安裝了VS6.0 SP5,MFCO42D庫的File Version為 6.0.8665.0, Product Version為 6.0.400。
[解決:]
為確保各編碼及維護人員使用的MFCO42D.DLL一致,對MFCO42D.LIB和MFCO42D.DLL進行了統一(把.lib和.dll拷貝到程序的當前路徑);同時將開發機上的MFCO42D.DLL和執行程序一起發布。
[疑問:]
為何MFCO42D的高版本沒有保持向下兼容?是否接口有變?