调用DLL发现calling convention mismatch 错误
错误信息:
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 发现很多和我一样问题的呢