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