2014-03-01 74 views
1

我找不到在我的工作的情況下在網絡的任何解決方案中使用。我的Microsoft Developer Network讀取,從這裏的問題和幾個維基,但沒有什麼,但看完這麼多的信息和一些矛盾給別人......我有一個爛攤子後!創建一個MinGW的DLL與一個VB EXE

我的歷史:

1 - 我不得不改變軟件在Visual C已經創建++(一個DLL),我不知道是哪的Visual Studio來編譯它,這個DLL是使用Visual Basic工作程序。

在改變程序使用其他通信協議(即是改變...容易)和

2 - 我的成功,我已經使用的Visual Studio 2012,我在我的電腦上一些.NET的問題,但我糾正他們,我的電腦應該罰款,以及我調試DLL,並在我的電腦完美的工作,但每當我把DLL到另一個使得運行時錯誤53(沒有找到文件),究竟沒有找到是MSVCP110D。 dll庫,我猜是因爲是VS 2012庫(編譯器vc11.0看起來像是因爲它),所以我決定下一步:

3-我決定將它遷移到Mingw,因爲我聽說可以創建DLL與VB EXE兼容,確定我安裝Eclipse和MinGW,並再次修改我的C++代碼,以適應MinGW的編譯器和天秤座里斯,現在我創建DLL,也.DEF和庫的.lib(好,我重命名擴展.a)中第一次給了我無法找到函數名的錯誤,然後我就把:

#ifdef __cplusplus 
    extern "C" { 
#endif 

和__stdcall(因爲__cdecl不是用於msvc,我讀的),在這個改變後運行時錯誤改變爲48(我讀這是加載DLL的問題),我檢查可能是.def的問題,嘗試建立與此.DEF全光照從VS 2012編譯器LIB.EXE和DUMPBIN一個新的DLL(但它不能正常工作)。我刪除了DllMain(它用於任何程序找到初始化的入口點),但我評論,因爲我沒有初始化任何東西,在這裏我粘貼一些我的代碼。

.H:

#define DLL_TESTER VB // define whenever I use the dll with the VB.exe 
    #ifdef DLL_TESTER 
     #ifdef DLLTRY_EXPORTS 
//after I use the option -DCPDLLEXPORT to define and set the value to __declspec(dllexport) 
      #define ADDCALL __declspec(dllexport) 
     #else 
      #define ADDCALL __declspec(dllimport) 
     #endif 
     #define DLLTRY __stdcall 
//this is supposly the correct one for VB.exe calls but try the __cdecl neither 
    #else 
//if is not with a VB.exe the tester would be a C application 
     #define EXTDLLCALL __cdecl 
     #ifdef DLLTRY_EXPORTS 
      #define ADDCALL __declspec(dllexport) EXTDLLCALL 
     #else 
      #define ADDCALL __declspec(dllimport) EXTDLLCALL 
     #endif 
#endif 

五月的順序是錯的,但我嘗試很多不同的順序,沒有工作的: __declspec(dllexport)返回值(INT)與__stdcall前__cdecl旁邊或返回值的另一邊, 在前面加上__stdcallcdecl ...每個訂單(因爲我看到了不同的訂單和每一個工作),但相同的運行時錯誤48.

#include <string> 
#include <Windows.h> 

#ifdef __cplusplus 
    extern "C" { 
#endif 

因爲有一個環節出現問題,如果只是聲明爲C++,所以應該是C被正確連接到VB.EXE(不同的編譯器)

我定義然後一些枚舉和結構,我認爲是好的,但如果在函數調用中存在此結構作爲參數,那麼我可能還應該導出結構?,在以前的版本中不是......但是我創建了一個沒有參數的函數,它也不能工作。

enum ERROR_DLL{ SUCCESS_CP_OK = 0,SUCCESS_CP_CANCELLED = 1} 

struct SDllIdentity{ 
    LPCSTR szID; 
    LPCSTR szDeviceID; 
} 

這就是爲什麼我包括WINDOWS.H,因爲這是工作,我想是因爲我沒有使用LPCSTR是一個char *類型它是失敗的VS2012,但即使我改變它爲char *呢不行。

int __stdcall __declspec(dllexport) InitialiseTerminal(const SDllIdentity* pSDllIdentity, LPCSTR szAddress, int nPort); 
//May the order is wrong, but as previously said I tried diferent combinations 

    int __stdcall __declspec(dllexport) DisconnectTerminal(const SDllIdentity* pSDllIdentity); 
    //ADDCALL int DLLTRY DisconnectTerminal(const SDllIdentity* pSDllIdentity); 
    #ifdef __cplusplus 
     } 
    #endif 

的.cpp:

#include "dlltry.h" 
//then I define some variables and a class, but I don't want to be exported 
__stdcall int InitialiseTerminal(const SDllIdentity* pSDllIdentity, LPCSTR szAddress, int nPort) { return 0;} 
__stdcall int /*ADDCALL*/ DisconnectTerminal(const SDllIdentity* pSDllIdentity) { return 0; } 

我並沒有包括所有的功能,但所有的看起來是一樣的,我希望我不會忘卻了「;」 :S,我看着這一切的網站:

http://www.transmissionzero.co.uk/computing/building-dlls-with-mingw/ http://msdn.microsoft.com/en-us/library/z4zxe9k8.aspx

我試圖.DEF midify,創建libdlltrx.a,所有我閱讀,我 僅次於解決辦法是安裝VS2008,因爲我認爲編譯 與那一個......但不知道,請閱讀,我讓它在 之前工作,但由於不兼容,我不能在其他人運行它,我不想 想要在其他PC上安裝任何其他軟件。

回答

1

哇,這是你在那裏做了很多不必要的工作。如果你想運行一個用任何一種Visual Studio創建的DLL,你需要在目標系統上安裝該Visual Studio版本的redistributable components。無論您在「解決方案」中遇到什麼問題,都可以返回10步並通過安裝解決原始問題。

+0

我知道會解決這個問題,但我無法在目標系統中安裝resdistributable組件,我不允許安裝任何東西,只包含一個dll,這是主要問題,我工作過很多,並且讀了很多,如果我不做,我會遇到嚴重的問題,因爲我有很多使用eclipse的經驗,而不是使用Visual Studio,所以完全可以使用Mingw,但最終我會嘗試用如果明天之前我沒有在Mingw找到解決方案,VS 2008:S。 非常感謝:)。 – seak

+0

您可以檢查安裝了哪些可再發行組件*並使用該版本的Visual Studio。這樣,你就不需要安裝新的東西。儘管爲了安全起見,如果該目標系統在VB出來後還沒有補丁,那麼最好還是尖叫。 – nvoigt

+0

我發現了!!!,是一個愚蠢的事情,因爲alwas發生了......我的上帝!, 只是Visual Studio平臺中的一個編譯選項, 如果您去項目解決方案屬性,請轉到C/C++>代碼生成,將運行時庫從MDd更改爲MTd,它允許不依賴於來自特定平臺的外部庫的運行時,它們將在編譯時間內靜態鏈接,而不需要安裝可再發行組件組件! Wooooaaahh! – seak