vc程序调用别人的dll报错的原因分析
2010-06-01 11:30
423 查看
做一个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的 所以就报错了。改了就好了
调用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的 所以就报错了。改了就好了
相关文章推荐
- VS或VC调用matlab程序dll路径配置及错误分析
- QT编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)
- dll调用失败的原因分析
- QT编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)
- QT编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)good
- [VC]MFC程序动态调用plugin DLL的方式
- 【转】将QT开发的界面程序封装成DLL,在VC中成功调用
- vc2005中DLL调用错误分析
- 将QT开发的界面程序封装成DLL,在VC中成功调用
- QT编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)
- QT编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)
- 【转】将QT开发的界面程序封装成DLL,在VC中成功调用
- C#调用dll提示"试图加载格式不正确的程序"原因及解决方法
- VB调用VC++的DLL问题:原因可能是托管的PInvoke 签名与非托管的目标签名不匹配。请检查PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。
- 通过分析exevc系统调用处理过程来理解Linux内核如何装载和启动一个可执行程序
- VC dll程序的编写与调用 笔记
- QT编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)
- 将QT开发的界面程序封装成DLL,在VC中成功调用(必须有消息循环,所以使用了QTWinmigrate,附CSDN可下载的Demo)
- VC开发TUXEDO 调用 DLL程序的注意点
- 将QT开发的界面程序封装成DLL,在VC中成功调用