调用DLL发现calling convention mismatch 错误

yardloun 2011-02-17 08:26:01
错误信息:

NON-FATAL RUN-TIME ERROR: "test.c", line 174, col 16, thread id 0x000008EC: CVI has detected an inconsistency of the run-time stack. This might have been caused by a calling convention mismatch in the last function call.


声明如下:

HMODULE objDll;
HWND mHand ;


void CALLBACK DisplayCallBackFunc(long nPort,char * pBuf,long nSize,long nWidth,long nHeight,long nStamp,long nType,long nReserved);
//typedef long int
typedef long int (*objFun_OpenStream)(LONG nPort,PBYTE pFileHeadBuf,DWORD nSize,DWORD nBufPoolSize); //定义函数指针
typedef long int (*objFun_SetDisplayCallBack)(LONG nPort,void (CALLBACK* DisplayCBFun)(long nPort,char * pBuf,long nSize,long nWidth,long nHeight,long nStamp,long nType,long nReserved)); //定义函数指针
typedef long int (*objFun_Play)(LONG nPort, HWND hWnd); //定义函数指针
typedef long int (*objFun_YV12toRGB32)(unsigned char* yv12, int width, int height, unsigned char* rgb); //定义函数指针
typedef long int (*objFun_InputData)(LONG nPort,PBYTE pBuf,DWORD nSize); //定义函数指针
typedef long int (*objFun_CloseStream)(LONG nPort);
typedef long int (*objFun_RefreshPlay)(LONG nPort);

objFun_OpenStream objOpenStreamAddress;
objFun_SetDisplayCallBack objSetDisplayCallBackAddress;
objFun_Play objPlayAddress;
objFun_YV12toRGB32 objYV12toRGB32Address;
objFun_InputData objInputDataAddress;
objFun_CloseStream objCloseStreamAddress;
objFun_RefreshPlay objRefreshPlayAddress;

程序代码如下:

hwnd=(HWND)GetCVIWindowHandle();
objDll = LoadLibrary("playSDK.dll");

if (objDll != NULL) //成功装载动态链接库.DLL
{



objOpenStreamAddress = (objFun_OpenStream)GetProcAddress(objDll, "PlayM4_OpenStream"); objSetDisplayCallBackAddress = (objFun_SetDisplayCallBack)GetProcAddress(objDll, "PlayM4_SetDisplayCallBack"); //取函数指针地址
objPlayAddress = (objFun_Play)GetProcAddress(objDll, "PlayM4_Play"); //取函数指针地址
objYV12toRGB32Address = (objFun_YV12toRGB32)GetProcAddress(objDll, "PlayM4_YV12toRGB32"); //取函数指针地址
objInputDataAddress = (objFun_InputData)GetProcAddress(objDll, "PlayM4_InputData"); //取函数指针地址
objCloseStreamAddress = (objFun_CloseStream)GetProcAddress(objDll, "PlayM4_CloseStream");
objRefreshPlayAddress = (objFun_RefreshPlay)GetProcAddress(objDll, "PlayM4_RefreshPlay");

// 如果函数指针有效,调用此函数。
if (objOpenStreamAddress) //dll中有函数()
{
//getchar();
re=(*objOpenStreamAddress)(0,NULL,0,0x64000); //调用dll函数!!!此语句导致程序退出时有未知错误发生
re=(*objSetDisplayCallBackAddress)(0,DisplayCallBackFunc); //调用dll函数!!!

re=(*objPlayAddress)(0,hwnd); //调用dll函数!!!
//re=(*objYV12toRGB32Address) (0,0,0,0x64000); //调用dll函数!!!
//re=(*objInputDataAddress) (0,0,0,0x64000); //调用dll函数!!!

}
//FreeLibrary(objDll); //卸载动态链接库.DLL,放在程序退出的函数里面

}



发生错误的语句在re=(*objOpenStreamAddress)(0,NULL,0,0x64000);
以及下面的类似的几条都是同样的错误。请问到底怎么解决这个问题呢?搜索calling convention mismatch 发现很多和我一样问题的呢
...全文
218 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
nicklisir 2011-02-18
  • 打赏
  • 举报
回复
同意#3;在定于函数指针时在前面加WINAPI或者CALLBACK 保持与DLL中的约定一致就可以
yardloun 2011-02-18
  • 打赏
  • 举报
回复
前两个同志:
这个程序在vc++里面已经成功运行了,所以参数并不存在问题

楼上的高人,能不能告诉我确切的解决方法呢?编译器默认为cdecl的,如果改代码的话,应该怎么改?
arong1234 2011-02-18
  • 打赏
  • 举报
回复
typedef long int (*CALLBACK objFun_OpenStream)(LONG nPort,PBYTE pFileHeadBuf,DWORD nSize,DWORD nBufPoolSize);

所有函数指针加这个试试
arong1234 2011-02-17
  • 打赏
  • 举报
回复
既然一个函数有CALLBACK修饰(也就是stdcall调用约定),我估计其他都需要这个,而你的所有函数指针都是cdecl调用约定的
logiciel 2011-02-17
  • 打赏
  • 举报
回复
请确认前3个参数0,NULL,0是否有效。
第1个参数应是PlayM4_GetPort得到的。第2个参数是头数据指针,要确认输入有效。第3个参数应该是头数据长度。
昵称很不好取 2011-02-17
  • 打赏
  • 举报
回复
在cmd中运行Dumpbin -exports dll_name.dll命令查看用到的dll中函数的名字是否是PlayM4_OpenStream,如果是C++,一般都会有命名改编的

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧