簡體   English   中英

創建與VB exe一起使用的Mingw DLL

[英]Create a Mingw DLL to be used with a VB exe

我在網絡上找不到適合我的情況的任何解決方案。 我在Microsoft開發人員網絡中閱讀,這里有問題,也有幾個Wiki,但是什么也沒有,但是在閱讀了這么多信息以及與其他人矛盾的信息之后……我一團糟!

我的歷史:

1-我必須更改已經在Visual C ++中創建的軟件(一個DLL),並且我不知道使用哪個Visual Studio對其進行編譯,該DLL正在與Visual Basic程序一起使用。

2-我成功地將程序更改為使用其他通信協議(即更改...很容易),並且我使用了Visual Studio 2012,但是我的計算機中存在一些.NET問題,但是我糾正了這些問題,我的計算機應該很好,很好,我調試了dll並在我的計算機上正常工作,但是每當我將DLL帶到另一個DLL時,都會發生運行時錯誤53(找不到文件),實際上找不到的是MSVCP110D.dll庫,我猜測是因為是VS 2012庫(編譯器vc11.0看起來是因為它),所以我決定下一步:

3-我決定將其遷移到Mingw,因為聽說可以創建與VB exe兼容的dll,好了,我安裝了eclipse和mingw,然后再次修改我的C ++代碼以適應Mingw編譯器和庫,現在我創建了dll,還有.def和庫.lib(好吧,我將擴展名重命名為.a)首先給我一個找不到函數名稱的錯誤,然后我輸入:

#ifdef __cplusplus
    extern "C" {
#endif

和__stdcall(因為__cdecl不是用於msvc的,我讀到的是什么),在此更改后,運行時錯誤更改為48(我讀到這是加載DLL的問題),我檢查是否可能是.def和嘗試在VS 2012編譯器的lib.exe和DUMPBIN中使用此.def創建新的DLL(但無法正常工作)。

我注釋了函數內部的所有內容,只是返回了值0,我刪除了其中存在的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 ,或者在返回值的另一側,在__stdcall前面和cdecl ...每個命令(因為我看到了不同的命令和每個工作),但運行時錯誤相同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的原因,因為在VS2012中這是有效的,我認為它失敗了,因為我沒有使用char *類型的LPCSTR,但是即使將其更改為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/zh-cn/library/z4zxe9k8.aspx

我試圖對.def進行midify,創建libdlltrx.a,我所閱讀的所有內容,我唯一的下一個解決方案是安裝VS2008,因為我認為可以使用該版本進行編譯……但不確定,請閱讀我使它能夠正常工作但是由於不兼容,我無法在其他計算機上運行它,也不想在其他PC上安裝任何其他軟件。

哇,您在那里做了很多不必要的工作。 如果要運行使用任何類型的Visual Studio創建的dll,則需要在目標系統上安裝該Visual Studio版本的可再發行組件 無論您的“解決方案”有什么問題,請返回10步並通過安裝解決原始問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM