创建一个用于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)之前或返回值的另一侧,前面带有__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/en-us/library/z4zxe9k8.aspx
我尝试midify .def,创建libdlltrx.a,所有我读的,我唯一的下一个解决方案将是安装VS2008,因为我认为是与那个编译...但不知道,请阅读,我让它工作之前但由于不兼容,我无法在其他人中运行它,而且我也不想在其他PC上安装任何其他软件。
哇,那是你在那里做的很多不必要的工作。 如果你想运行用任何一种Visual Studio创建的DLL,你需要在目标系统上安装该Visual Studio版本的可再发行组件。 无论您在“解决方案”中遇到什么问题,都可以返回10步并通过安装解决原始问题。
链接地址: http://www.djcxy.com/p/41897.html