创建一个用于VB exe的Mingw DLL

我找不到适用于我的案例的任何解决方案。 我在微软开发者网络上读到过这里和几个维基的问题,但是没有任何结果,但是在阅读了很多信息和一些与其他人相矛盾的信息之后......我有一团糟!

我的历史:

1-我必须更改已经在Visual C ++(一个DLL)中创建的软件,并且我不知道使用哪个Visual Studio编译它,此DLL使用Visual Basic程序。

2 - 我成功地改变了程序使用另一种通信协议(这是变化...容易),我已经使用Visual Studio 2012,我的电脑有一些.NET问题,但我纠正它们,我的电脑应该是好,我调试DLL,并在我的电脑完美工作,但每当我把DLL到另一个使运行时错误53(没有找到该文件),实际上没有找到是MSVCP110D.dll库,我因为是VS 2012库(编译器vc11.0如此看起来是因为它),所以我决定下一步:

我决定将它迁移到Mingw,因为我听说可以创建与VB EXE兼容的dll,确定我安装了eclipse和mingw,然后再次修改我的C ++代码以适应Mingw编译器和库,现在我创建了dll,也.def和库.lib(以及我重命名扩展名为.a)首先给我一个错误,找不到函数名称,然后我把:

#ifdef __cplusplus
    extern "C" {
#endif

和__stdcall(因为__cdecl不是用于msvc,我读的),在这个改变后,运行时错误改变为48(我读这是加载DLL的问题),我检查可能是.def的问题,尝试使用这个.def创建一个新的DLL,使用VS 2012编译器的lib.exe和DUMPBIN(但它不能正常工作)。

我评论我的函数内的所有内容,只是返回值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)在__stdcall和__cdecl旁边的返回值(int)之前或返回值的另一侧,前面带有__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的原因,因为在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/en-us/library/z4zxe9k8.aspx

我尝试midify .def,创建libdlltrx.a,所有我读的,我唯一的下一个解决方案将是安装VS2008,因为我认为是与那个编译...但不知道,请阅读,我让它工作之前但由于不兼容,我无法在其他人中运行它,而且我也不想在其他PC上安装任何其他软件。


哇,那是你在那里做的很多不必要的工作。 如果你想运行用任何一种Visual Studio创建的DLL,你需要在目标系统上安装该Visual Studio版本的可再发行组件。 无论您在“解决方案”中遇到什么问题,都可以返回10步并通过安装解决原始问题。

链接地址: http://www.djcxy.com/p/41897.html

上一篇: Create a Mingw DLL to be used with a VB exe

下一篇: MinGW binary 3x as big as MSVC binary