创建一个与VB exe一起使用的Mingw DLL

时间:2014-03-01 15:33:01

标签: c++ visual-studio-2012 dll mingw

我在网络上找不到适合我案例的任何解决方案。我在微软开发者网络上看到了这里的问题以及几个wiki,但没什么,但是在阅读了这么多信息和一些与其他人相矛盾之后......我一团糟!

我的历史:

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,因为我听说可以创建与VB exe兼容的dll,好吧我安装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(但它无法正常工作)。

我在我的函数内部注释只返回值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旁边或返回值的另一侧, 前面有__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 *也不起作用。 / p>

    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; }

我没有包含所有功能,但看起来都一样,我希望我不会伪造一个&#34 ;;&#34; :S,我查看了所有这些网站:

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

我试图调整.def,创建libdlltrx.a,所有我读过的, 我唯一的下一个解决方案是安装VS2008,因为我认为是编译 那个...但不确定,请阅读我之前的工作 但由于不兼容,我无法在其他人中运行它而我不这样做 想在其他电脑上安装任何其他软件。

1 个答案:

答案 0 :(得分:1)

哇,你在那里做了很多不必要的工作。如果要运行使用任何类型的Visual Studio创建的dll,则需要在目标系统上安装该Visual Studio版本的redistributable components。无论您的“解决方案”遇到什么问题,都可以退回10步并通过安装原始问题来解决问题。