分享

vc程序调用别人的dll报错的原因分析

 魔道黑客 2011-01-23
 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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多