2010-12-13 143 views
0

我開發了使用vs2005的MFC Regular DLL「Static Linked」。當它被編譯爲32位DLL時Win7上的LoadLibrary問題(64位)

我可以使用「LoadLibrary」從我的機器或任何其他機器加載它。

但編譯爲64位DLL時,我只能從我的機器加載它。

我查看我的代碼並找到聲明的全局對象。

MyClass myObj; 
當我評論這個object..I可以加載DLL並使用它從不同勢machine.but當任何

全局對象發現

...我不能從diffrenet機加載我的DLL。

任何人都可以幫助我嗎?

+1

其他機器64位兼容嗎? – 2010-12-13 12:43:06

+0

yes..it Win7 64位也 – NMM 2010-12-13 12:45:57

+2

你的DLL有任何依賴?使用sysinternals中的depends.exe – Benoit 2010-12-13 12:52:11

回答

2

,當我嘗試使用 「GetLastError函數」,它返回象數 「-529697949」

錯誤代碼是0xe06d7363,最近3個十六進制數字拼 「MSC」。這是Microsoft編譯器中C++異常的例外代碼。

您的代碼正在轟炸未捕獲的C++異常,可能拋出DllMain()。如果您無法從此提示中進行逆向工程,則需要調試器。

+0

你能解釋我該如何做到這一點? – NMM 2010-12-13 14:42:57

+0

我沒有DLLmain在我的DLL – NMM 2010-12-13 14:53:02

+0

嗯,我只能猜測。通過調試器告訴你的內容。 – 2010-12-13 15:06:32

0

當您的dll的全局/靜態對象被創建/分配/初始化(這是DllMain的一部分)時,也可以拋出未被捕獲的C++異常。所以有一個很好的機會,在代碼中的某個地方有一個有效的throw語句負責這種行爲(而不是某些編譯器/體系結構/平臺錯誤;也許它只是一個x64特定的定義?)。

要找到討厭的小*#!!:

  • 編譯與調試信息(/ DEBUG)
  • 打開符號服務器(調試/選項/調試/符號/符號文件上的所有代碼(.pdb)位置:
  • 打開所有打破例外(調試/例外... /勾選「Thrown」列中的所有[]]
  • 開始調試,您將最終找到正確的地方。

由於缺少強制執行的「throws」語句,例如,在Java中(在C++中它是可選的,非常沒用;請參閱Throw keyword in function's signature),try/catch/throw系統幾乎不可用於創建健壯且可維護的代碼;它幾乎就像隱藏隨機gotos到處。