Posted on 2006-04-14 16:13
奔跑的阿甘 閱讀(4375)
評論(2) 編輯 收藏 引用 所屬分類:
SDK/MFC
在MFC中使用OCX控件遇到的一個(gè)問題
[問題:]
在一個(gè)簡單的MFC對話框中嵌入一個(gè)OCX控件(如瀏覽器控件),該控件采用動態(tài)方式創(chuàng)建,即調(diào)用CWnd::Create()接口生成窗口,在本機(jī)運(yùn)行良好,但是在其它部分機(jī)器上運(yùn)行則出現(xiàn)程序異常,報(bào)告occsite.cpp的第161行出現(xiàn)錯(cuò)誤。當(dāng)把源程序放到目標(biāo)機(jī)器上重新編譯后程序可以正常運(yùn)行。以下是示例代碼:
m_pFlashPlayer = NULL;? // 一個(gè)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();
?}
}
這個(gè)問題帶來的后果是如果要發(fā)布該程序到100臺機(jī)器上,則必須要在100臺機(jī)器上重新編譯一遍程序才能正確執(zhí)行。
[分析:]
經(jīng)過測試,發(fā)現(xiàn):
1)該問題只存在于程序DEBUG版本中,在RELEASE版本中不存在該問題。
2)該問題和MFC有關(guān),和所嵌入的控件本身沒有任何關(guān)系。
經(jīng)過深入分析,發(fā)現(xiàn):該問題是由于開發(fā)機(jī)和目標(biāo)機(jī)使用的MFCO42D.DLL庫不匹配引起的。
[結(jié)果:]
經(jīng)過確認(rèn),發(fā)現(xiàn)開發(fā)機(jī)和目標(biāo)機(jī)的運(yùn)行環(huán)境有如下差異:開發(fā)機(jī)未安裝任何VS補(bǔ)丁,MFCO42D庫的File Version為6.0.8168.0, Product Version為 6.0.000,而目標(biāo)機(jī)安裝了VS6.0 SP5,MFCO42D庫的File Version為 6.0.8665.0, Product Version為 6.0.400。
[解決:]
為確保各編碼及維護(hù)人員使用的MFCO42D.DLL一致,對MFCO42D.LIB和MFCO42D.DLL進(jìn)行了統(tǒng)一(把.lib和.dll拷貝到程序的當(dāng)前路徑);同時(shí)將開發(fā)機(jī)上的MFCO42D.DLL和執(zhí)行程序一起發(fā)布。
[疑問:]
為何MFCO42D的高版本沒有保持向下兼容?是否接口有變?