2010-02-17 137 views
4

我正在爲我的高級項目編寫一個編程學習遊戲,我正在尋找一種編譯器,它可以編譯一個DLL,然後可以將它動態加載到Visual Studio 2008 C++應用程序中。可重新編譯的編譯器 - 用於MS Visual Studio的DLL

這裏的重要思想是編譯器是可再發行的。如果VS是可再發行的,我會使用它。

到目前爲止,我已經使用MinGW取得了一些成功,但成功是有限的。目前,我只能夠一次加載和運行一個DLL。當我嘗試加載第二個VS C++應用程序崩潰時出現Access Violation錯誤。

我已經能夠加載在VS本身沒有問題編譯的兩個DLL,所以它使我相信它是特定於MinGW的東西,它的DLL,以及它們如何與LoadLibrary()以及它們進行交互。

我一直在這個問題上工作了很長一段時間,我很害怕。如果有人知道你知道會使用不同的編譯器,而不是MinGW,或者如果你看到這個問題,你可能知道爲什麼第二個DLL會崩潰。我確定它與每個DLL都以某種方式相互關聯,但我不知道這會是什麼或如何發現。

這可能是我編譯DLL的方式或我如何加載它;我不知道。

我真的很感謝意見, 謝謝!

編輯: 這些都是簡單的調用g ++以及dlltool用於創建DLL http://pastebin.com/f675df4b0

這是從我的dll的一個來源。 http://pastebin.com/f5c062611

這是我的C++應用程序中加載DLL的代碼。 http://pastebin.com/f52f94a18

-Michael

+0

你可以嘗試提供一些關於崩潰的更多信息。它在哪裏崩潰。在LoadLibrary調用中,還是在調用您導入的任何特定函數時? – Laserallan 2010-02-17 23:03:45

+0

這是一個通用的「訪問衝突」崩潰。正確的LoadLibrary()。但總是在加載第二個DLL。它在第一次LoadLibrary()調用時從不崩潰。 如果我今晚可以在DLL函數中粘貼dll源代碼,dll編譯命令和代碼。 – 2010-02-18 00:28:57

回答

0

您正在從DllMain返回0。根據規格你應該返回TRUE,除非出現問題。不過,我不明白爲什麼這應該給MSVC或MinGW不同的行爲。它還說如果DllMain返回FALSE,LoadLibrary應該返回0,所以這可能不是實際的解釋。

DllMain是否實際上在MSVC和MinGW版本中都被調用,如果刪除了其中的消息箱調用的註釋,會發生什麼情況?

有關DllMain的更多信息,請http://msdn.microsoft.com/en-us/library/ms682583(VS.85).aspx

可能會感興趣,如果你實際加載第二個之前調用從第1個DLL的AiFunction另一件事。如果你這樣做,你可以嘗試加載這兩個dll的,而無需調用任何dll函數,看看它是否更好?

我的懷疑是MinGW和MSVC以不同方式打包輸入或輸出結構,並且在調用AiFunction時,這種大小不匹配會導致某些內存被損壞。您可以通過比較dll內部和外部的輸出和輸入的sizeof()結果並查看它是否匹配來檢查此問題。這並不能保證它是正確的,但如果它不匹配,你可以肯定會出現一些問題。

最後我擔心,如果你開始引入虛擬調用等等,那麼返回Output可能會成爲一個長期的問題,因爲這可能不會以完全相同的方式在MSVC和MinGW中實現。如果你沒有虛擬功能和其他東西,只要結構包裝匹配就可以。

+0

你給了我很多東西來看看。 DllMain的事情是正確的,它解決了我遇到的問題之一,但不是主要的問題之一。到目前爲止,DllMain被調用的第一個DLL被加載得很好。但是當我調用第二個函數時,LoadLibrary內部存在那個訪問錯誤。我刪除了所有額外的代碼,直到只有一個導出函數(無結構或包含),並且它仍然會加載第一個,第二個崩潰。 sizeof的是一樣的順便說一句。我認爲伊瑪分手,只是使用VS ..地獄,這只是高級項目的權利? – 2010-02-21 23:50:12

1

也只是使用Visual Studio Express的不夠好?編譯器可以免費下載,並且可以幫助您獲得兼容的DLL,從而爲您節省很多痛苦。

我不知道你的要求有多嚴格,但是如果你在Visual Studio Express上檢查授權信息,它對你的項目來說就足夠寬鬆了。

+0

我早點查看。雖然Visual Studio Express可以免費下載,但重新發布並不合適。 但是,謝謝。 – 2010-02-17 22:41:19

+1

出於好奇,爲什麼你需要親自重新分配編譯器,而不是讓最終用戶自己下載它? – Weembles 2010-02-19 00:19:48