现在的位置: 首页 > 综合 > 正文

Call dll function..

2013年08月13日 ⁄ 综合 ⁄ 共 1947字 ⁄ 字号 评论关闭

//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

 

 

 

抱歉!评论已关闭.