今天试验了一下C++利用windows api调用dll。dll代码是用delphi编译出来的,调用的代码是C++。
先看delphi写的dll
代码
unit
Unit1;
interface
function Add(ANumOne, ANumTwo: Integer): Integer; stdcall ;
implementation
function Add(ANumOne, ANumTwo: Integer): Integer; stdcall ;
begin
Result : = ANumOne + ANumTwo;
end ;
exports
Add;
end .
interface
function Add(ANumOne, ANumTwo: Integer): Integer; stdcall ;
implementation
function Add(ANumOne, ANumTwo: Integer): Integer; stdcall ;
begin
Result : = ANumOne + ANumTwo;
end ;
exports
Add;
end .
再看C++调用
代码
#include
<
iostream
>
#include < windows.h >
typedef int ( * AddFunc)( int , int )__stdcall;
int main( int argc, char ** argv)
{
HINSTANCE handle;
handle = LoadLibrary( " d:\Test.dll " );
AddFunc func = (AddFunc)GetProcAddress(handle, " Add " );
std::cout << func( 3 , 4 ) << std::endl;
return 0 ;
}
#include < windows.h >
typedef int ( * AddFunc)( int , int )__stdcall;
int main( int argc, char ** argv)
{
HINSTANCE handle;
handle = LoadLibrary( " d:\Test.dll " );
AddFunc func = (AddFunc)GetProcAddress(handle, " Add " );
std::cout << func( 3 , 4 ) << std::endl;
return 0 ;
}
其实编译好的二进制文件例如exe和dll在运用的时候都会映射到内存中去。因此只要在这段映射的内存中找到需要调用的函数的地址,
并且知道函数的调用形式就可以用函数指针加以调用。
在delphi代码中,我们可以看到Add函数带有两个参数,并且标明了是stdcall的调用形式,export标明了导出函数是Add
在C++代码中,我们用到了两个api函数
- 第一个是LoadLibrary函数,它的作用是将dll映射到内存,并且返回句柄
- 第二个函数是GetProcAddress,它的作用是返回函数指针,注意一定要利用先验知识进行正确的类型转换, 不然会调用失败。