您的位置:首页 > 编程语言 > Delphi

Delphi调用C++编写的动态链接库dll的方法

2015-11-16 11:48 886 查看
首先我们先看一下普通Delphi调用动态链接库dll的方法:

{===================静态调用DLL函数===================}

//首先声明这个DLL中的函数,然后就可以直接调用了

function AddNum(Num1,Num2:integer):integer;stdcall;external 'project1.dll' name 'AddNumber';

//function AddNum(Num1,Num2:integer):integer;stdcall;external 'Add_Dll_test.dll' name 'AddNumber';

procedure TForm1.Button1Click(Sender: TObject);

var

  Num1,Num2:integer;

  Sum:integer;

begin

  Num1:=StrToInt(Edit1.Text);

  Num2:=StrToInt(Edit2.Text);

  Sum:=AddNum(Num1,Num2);

  Edit3.Text:=IntToStr(Sum);

end;

{===================动态调用DLL函数===================}

procedure TForm1.Button2Click(Sender: TObject);

Type

  //这里的TADDFunc即是Project1.dll中的AddNumber方法

  TADDFunc=function (X,Y:Integer):integer;Stdcall;

var

  OneHandle:THandle;

  ADDFunc:TADDFunc;

  Num1,Num2:integer;

  Sum:variant;

begin

  Num1:=StrToInt(Edit1.Text);

  Num2:=StrToInt(Edit2.Text);

  OneHandle:=LoadLibrary('project1.dll');   //动态载入DLL,并返回其句柄

  try

    if OneHandle <> 0 then

      ADDFunc:=GetProcAddress(OneHandle,'AddNumber');    //获取内部函数的地址

    if (@ADDFunc <> nil) then

      begin

        sum:=ADDFunc(Num1,Num2);  //实际的仿真函数

        Edit3.Text:=IntToStr(sum);

      end

    else

      RaiseLastWin32Error;  //异常处理

  finally

    FreeLibrary(OneHandle);   //调用完毕回收DLL占用的资源

  end;

end;

而用C++编写的动态链接库使用大致相同,不同的是Name可能会出现乱码,这样就需要我们去查看函数名或者使用其他方法去解决:

1.查看函数名:

在dll文件的文件夹下,用“Shift+鼠标右键”选择“在此处打开命令窗口”,输入“tdump ***.dll”,查看内部的函数名

2.使用函数位置(不推荐)

如果一个DLL文件不会再改动了,每个函数的位置也是固定的了,可以使用函数位置去寻找函数地址,具体方法:

ADDFunc:=GetProcAddress(OneHandle,MakeIntResource(1));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  delphi 动态链接库