//May.31..2009 the last day of May....
//Code by sealplusplus for ParallelPort control..
//Will used the inpout32.dll for ParallelPort...
// Take: ParallelPort ID and bit.
// Return: the ParallelPort station.
//void _stdcall Out32(int PortAddress, int data);
//int _stdcall Inp32(int PortAddress);
void CMy1Dlg::OnBnClickedButtonPport()
{
typedef void( __stdcall SQRTPROCO)(int, int);
typedef int( __stdcall SQRTPROCI)(int);
unsigned char GetPPData = 'A';
HINSTANCE hInstance;
SQRTPROCO* pFunctionO;
SQRTPROCI* pFunctionI;
VERIFY(hInstance = ::LoadLibrary("D://SealWork//inpout32.dll"));
VERIFY(pFunctionO = (SQRTPROCO*)::GetProcAddress(hInstance, "Out32"));
(*pFunctionO)(888, 230);
VERIFY(pFunctionI = (SQRTPROCI*)::GetProcAddress(hInstance, "Inp32"));
GetPPData = (*pFunctionI)(888);
FreeLibrary( hInstance );
hInstance = NULL;
return;
}
//May.31..2009 the last day of May....
VC调用Delphi动态链接库的错误(Run-Time Check Failure #0)2008-12-02 14:45Run-Time Check Failure #0 - The value of ESP was not properly
saved across a function call. This is usually a result of calling a function declared with one calling convention
with a function pointer declared with a different calling convention.
ESP: 栈指针
可能是以PASCAL方式调用了cdecl的函数,或倒过来。
假设编译器不会搞错,可能是
int PASCAL a();
int (cdecl*b)() = (int(cdecl*)())a);
b();
错误原因:
你定义函数指针原型时出错。
其实你定义的没有错,但是编译器不认识而已,因为你调用的dll函数是一个远函数,而且是一个C函数,你得告诉编译器它是个c函数才行。那么你就可以在定义该函数的时候加上
一句话,
FAR PASCAL 或者 __stdcall 这个就OK了。
具体做法:
比如说你要定义一个 返回类型为空,参数为空的函数指针:
typedef void (*LPFUN)(void);
这样确实跟我们dll里的函数匹配了,上面也说了,我们应该添上几个字,告诉编译器这个是一个远的C函数。
typedef void (WINAPI *LPFUN)(void);
typedef void (__stdcall *LPFUN)(void);
typedef void (FAR PASCAL *LPFUN) (void);
像上面这样定义就OK了,如果用的是VC++,那么直接用第一种定义就ok了。
注意,上面是使用 MFC (DLL)的做法。
如果是WIN32 DLL,得相应的去掉WINAPI ,__stdcall ,FAR PASCAL 这几个参数。因为WIN32 DLL 默认的入栈方式为 __cedcall方式,不是__stdcall方式。
具体的组合方式太多了,反正知道错误的原因是声明相应的函数未匹配就行了。实在不行,一个一个的试吧.....
.............
http://p.blog.csdn.net/images/p_blog_csdn_net/sealplusplus/EntryImages/20090531/DebugAndWindow.jpg