我在网络上找不到适合我案例的任何解决方案。我在微软开发者网络上看到了这里的问题以及几个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
旁边或返回值的另一侧,
前面有__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 *也不起作用。 / 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,因为我认为是编译 那个...但不确定,请阅读我之前的工作 但由于不兼容,我无法在其他人中运行它而我不这样做 想在其他电脑上安装任何其他软件。
答案 0 :(得分:1)