vc程序调用别人的dll报错的原因分析 收藏
做一个vc的程序,要调用到别人的dll,有两个,一个是c++写的, 一个不是c++写的(可能是Delphi写的吧)。 调用c++写的那一个dll使用静态加载动态加载都行, 但Delphi写的那个dll因为没有lib文件,也就只能动态加载了。
好的,那就统一都动态加载吧。
同是一样的加载代码,但调用Delphi写的Dll却报错
已经确保了Delphi写的dll没错了,什么原因呢
修改如下就没有错误了:
看下面代码
//////////////////////////////////////////////////////////////
// a.CPP HMODULE g_hCPPDll = 0; HMODULE g_hDelphiDll = 0; // CPPDll
void (*FunA)() = NULL; void (*FunB)(void*,__int64,int) = NULL; // DelphiDll
struct DllStruct; { char ch[20]; }; void (__stdcall *FunC)(const DllStruct*) = NULL; void Init()
{ // 加载动态库 g_hCPPDll = ::LoadLibraryA("CPPDll.dll"); if(g_hCPPDll == NULL) { return; } FunA= (void(*)())GetProcAddress(g_hCPPDll,"FunA"); FunB = (void (*)(void*,__int64,int))GetProcAddress(g_hCPPDll,"FunB"); // 加载动态库 g_hDelphiDll = ::LoadLibraryA("DelphiDll.dll"); if(g_hDelphiDll == NULL) { return; } FunC= (void(__stdcall *)())GetProcAddress(g_hDelphiDll,"FunC"); } void Release()
{ FreeLibrary(g_hCPPDll); FreeLibrary(g_hDelphiDll); } ////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
// B.CPP struct DllStruct; { char ch[20]; }; // CPPDll
extern void (*FunA)(); extern void (*FunB)(void*,__int64,int); // DelphiDll
extern void (__stdcall *FunC)(const DllStruct*); void Use() { if(FunA) { FunA(); } struct DllStruct dllStruct; if(FunC) { FunC(&dllStruct); // 在这里报错了, 修改为__stdcall 后就不报错了 } } ////////////////////////////////////////////////////////////////////////////////////////// 原因就很明显了 c++函数声明默认是__cdecl的, 而Delpi是__stdcall的 所以就报错了。改了就好了 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cay22/archive/2010/06/01/5638954.aspx
|
|