舰队collection速吸流:vc程序调用别人的dll报错的原因分析 - cay22的专栏 - CSDN博客
来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 15:06:12
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
做一个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
vc程序调用别人的dll报错的原因分析 - cay22的专栏 - CSDN博客
vc++ - lonelytreebjfu的专栏 - CSDN博客
用 VC 获取其它运行中程序的命令行参数 - wonsoft的专栏 - CSDN博客
DLL Hell的解决方案 - jonathandj的专栏 - CSDN博客
VC 皮肤库 - lchunli的专栏 - CSDN博客
C++Builder及VC的DLL相互调用
C#程序调用非托管C++ DLL文件的方法 - Chase的技术博客 - 博客园
VC++6.0程序去掉程序对msvcp60.dll的倚赖
老生常谈之C++和C#之间互相调用 - gangyilovevc的专栏 - CSDN博客
bbbbbbj的专栏 - CSDN博客
Heapdump分析过程 - folin的专栏 - CSDN博客
BIOS启动过程分析 - 阿来的专栏 - CSDN博客
[C VC] iconv库的使用 - 毛C毛Py的专栏 - CSDN博客22
JNI性能测试一—JNI调用C与Java调用java性能比较 - zgjxwl-----传说中晨雨的专栏 - CSDN博客
VC 中预处理指令与宏定义的妙用(2)## 连接符与# 符 - wangwpf的专栏 - CSDN博客
ASCII码表 - heruibin的专栏 - CSDN博客
tcp cwnd - linweixuan的专栏 - CSDN博客
RTMP是什么 - Thinkor2k8的专栏 - CSDN博客
手机知识 - whpeace的专栏 - CSDN博客
指针Guide - chinahai的专栏 - CSDN博客
数据库触发器 - chinayuan的专栏 - CSDN博客
中国式管理 - wmnothing的专栏 - CSDN博客
IE捉迷藏 - bluesqsr的专栏 - CSDN博客
kernel panic Call Tree 分析方法 - unbutun的专栏 - CSDN博客