Delphi 调用VC生成的DLL

1. 在VC中新建一个 DLL 工程。
写如代码,如:

extern "C"
{
  _declspec(dllexport) int getPPLength();
  _declspec(dllexport) int npn(int m, int n);

}

int getPPLength()
{
  return 5* 12;
}

int npn(int m, int n) {
    int sum;
    sum = (m-1) * (n-1);
    return sum;
    //return 100;
}

编译生成 DLL 文件。
2。 在Delphi 中申明
function getPPLength:Integer;cdecl; external 'dll.dll';
function npn(m:integer;n:Integer):Integer;cdecl; external 'dll.dll';


即可。
注意:这里我是用 cdecl 参数调用方式!

 

 

设有以下三个变量:
var
  s:string;
  p:pchar;
  a:array[1..20] of char;
那么三者之间的转换如下:
1、字符串到PChar
    p:=PChar(s);
2、PChar到字符串
    s:=p;
3、PChar到字符数组
    StrCopy(@a,p);
4、字符数组到PChar
    PChar(@a);
5、字符串与字符数组之间的转换就只有通过PChar来中转了。例如下面这个例子:
procedure TForm1.btn1Click(Sender: TObject);
var
  str:array[1..10] of char;
begin
  StrCopy(@str,PChar(mmo1.Text));
  mmo2.Text:=PChar(@str);
end;

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhuqinglu/archive/2008/08/22/2816288.aspx

大家在软件开发时经常会遇到这样的情况,在不同的开发环境中为实现一些功能相同的过程,由于开发所使用的设计语言不同,因而不得不编写许多类似的代码,甚至有时要在同一个开发环境不同项目中重写代码,这就造成了很大的资源浪费。动态链接库能较好的解决这个问题,重复利用代码将大大提高了开发效率。一般,用户在应用程序中基于如下要求创建和使用DLL:  
   
  1.   在不同的可执行文件之间共享的程序;  
   
  2.   在设计应用程序时,将其拆分成各个相互独立功能部件,为以后这些功能部件各自升级提供方便的途径。  
   
  动态链接库将共享程序或功能部件做成库中的函数,形成DLL文件,其它应用程序通过使用DLL调用这些函数。在这里将对Delphi和VC中创建和使用动态链接库的方法做一介绍。Delphi和VC定义的动态链接库均可在两者的开发环境中使用。  
   
  一、   用Delphi创建DLL  
   
  Delphi的DLL创建并不复杂,下面向大家介绍Delphi的DLL创建方法。  
   
  (1)首先创建一个新的DLL项目(NewProject)project1,文件头部为:  
   
  library   Project1;    
   
  (2)USES语句后面加入ExPorts语句,指明调用DLL的函数名,形式为:  
   
  exports  
   
    checkpwd   name   'checkpwd';    
   
  (3)在DLL的Pas文件中Type......End后加入该DLL的函数或过程的声明,形式如下:  
   
  FunctionName(argment):Boolean;export;    
   
  该函数也可以存在于另一个pas文件中(如Unit1.pas),此时只需在项目文件中加入:  
   
  uses  
   
    Unit1   in   'Unit1.pas'   {Form1};    
   
  值得注意的是,该函数或过程应加入窗体的Create和Free(产生和释放)方法。  
   
  (4)对项目进行编译即形成DLL文件,可被其它项目调用。  
   
  二、Delphi中DLL的调用  
   
  调用DLL有两种方法,一种是在应用程序装载时调用,另一种是在应用程序运行时调用。  
   
  (1)   装载时调用DLL  
   
  在调用DLL的Pas文件中,对DLL函数进行外部声明,声明应位于Implementation后,形式如下:  
   
  Implementation  
   
    Function   functionname(argment):Boolean;far;External   'DllName';    
   
  其中External关键字后面的引号内是DLL的文件名,该文件一般应放在系统的system目录下,或与调用它的项目同一目录。声明以后即可在Pas文件任何地方引用DLL函数。  
   
  装载时调用DLL的优点是速度较快,程序间也可共享代码。  
   
  (2)   运行时调用DLL  
   
  DLL的另一种调用方法是在运行时调用。这种方法要调用到Windows的API函数LoadLibrary,GetProcAddress,FreeLibrary等。此方法主要用于调用其它语言,特别是C++编译的DLL。  
   
  假定你欲调用的DLL中包括一个函数:  
   
  Function   checkpwd(pwd:string):boolean;export;    
   
  那么,首先在欲调用DLL的程序Type类型声明处加入一句:  
   
  Type  
   
    Tcheckpwd=   function(pwd:string):boolean;    
   
  此句的作用如同C++中声明的函数指针。  
   
  然后定义如下变量∶  
   
  Var  
   
      aptr:TFarproc;  
   
    lhnd:THandle;  
   
    flag:boolean;    
   
  其中Aptr,lhnd两变量声明必须有,flag是DLL函数返回值,视情况而定。在调用DLL处加入如下语句进行DLL装载:  
   
  lhnd:=Loadlibrary('路径:DLL文件名');{如lhnd:=Loadlibrary('c:/project1.dll');  
   
    aptr:=GetprocAddress(lhnd,'checkpwd');    
   
  下面可直接调用DLL了:  
   
  flag:=Tcheckpwd(aptr)(   'pwd');{根据函数填相应的变量参数}    
   
  调用完以后,用FreeLibrary释放DLL占用的内存:  
   
  FreeLibrary(lhnd);  
   
  三、用VC创建DLL  
   
  在VC中创建DLL,与Delphi中的创建过程相似,步骤如下:  
   
  (1)新建一个DLL项目。MFC提供两种类型的动态链接库:常规型DLL、扩展型DLL。其中,常规型DLL适合于非MFC开发环境下采用支持DLL调用的程序设计语言开发的应用程序,扩展型DLL只能被MFC程序使用。  
   
  (2)创建该DLL中的过程或函数,只需在程序中加入下列语句:  
   
  extern   "C"   _declspec(dllexport)    
   
    int   yanzheng(CString   input,char*   zcm)  
   
    {  
   
    AFX_MANAGE_STATE(AfxGetStaticModuleState());  
   
    file://具体实现过程  
   
    }    
   
  该函数的功能是验证注册码是否合法,其中yanzheng为函数名,int为函数返回值类型,()内为函数参数。编译通过后即可使用。  
   
  四、   VC中DLL的调用  
   
  在VC中调用动态链接库时,类似于Delphi中运行时调用DLL的方法。也要调用到Windows的API函数LoadLibrary,GetProcAddress等。此方法对于调用其它语言和VC编译的DLL均适用。  
   
  假定DLL中包括一个函数:  
   
  int   yanzheng(CString   input,char*   zcm)    
   
  首先在欲调用DLL函数的cpp文件前部先声明函数指针,定义函数类型:  
   
  typedef   int   (*   _YANZHENG)(CString,char*   zcm);    
   
  然后定义如下变量∶  
   
  HINSTANCE   hLibrary;  
   
    _YANZHENG   yanzheng;    
   
  在调用DLL处加入如下语句进行DLL装载:    
   
  hLibrary=LoadLibrary("zcdll.dll");  
   
    yanzheng=(_YANZHENG)GetProcAddress(hLibrary,"yanzheng");  
   
    shuchu=   (*yanzheng)(shuru,zcm);  
   
    FreeLibrary(hLibrary);    
   
  五、   几点提示  
   
  (1)如果用Delphi创建DLL时用到其它的form,则在DLL的输出函数中应包括form的create(创建)和free(释放),而且在显示该窗口时只能用showmodal过程,不能用show过程,在后面的例子中能详细看到。  
   
  (2)如果Delphi创建的DLL中的函数或过程,用string类型作为参数输入或返回string类型,当用VC或其它程序调用时,经常会出错,反之亦然。为了解决这种情况,使不同程序之间在使用字符串类型时,接口更安全,建议使用pchar类型,而不是string类型。而且要在程序中加入内存管理,使用系统提供的sharemem单元。下面是一个实现将星期标识由数字转换成英文的例子:  
   
  uses  
   
    sharemem;  
   
    exports  
   
    makeitaday;  
   
    var    
   
    mydate:pchar;  
   
    function   makeitaday(S:integer):pchar;stdcall;export;  
   
    implementation  
   
    function   makeitaday(S:integer):pchar;stdcall;export;  
   
    var  
   
    thedate:array[0..20]   of   char;  
   
    begin  
   
    GetMem(mydate,   200);  
   
    if   s=1   then   thedate:='Sunday   ';  
   
    file://……….  
   
    strpcopy(mydate,thedate);  
   
    makeitaday:=mydate;  
   
    end;    
   
  六、实例  
   
  因为用Delphi创建和调用DLL,过程与用VC创建和调用DLL相似,只是前者代码要比在VC环境中稍微复杂一些,因此在文章的最后给出一个完整的用Delphi创建和调用DLL的例子。该DLL主要用来检查输入的口令是否正确,窗体含有一个Edit编辑框,一个按钮Button,在编辑框内输入口令,比较编辑框的值和输入参数返回真假值。  
   
  //文件名为checkpassword.dpr;编译此文件生成checkpassword.dll    
   
    library   checkpassword;  
   
    uses  
   
    SysUtils,   Classes,   Unit1   in   'Unit1.pas'   {Form1};  
   
    exports  
   
    checkpwd   name   'checkpwd';//声明DLL函数  
   
    {$R   *.RES}  
   
    begin  
   
    end.  
   
  file://文件名为unit1.pas    
   
    unit   Unit1;  
   
    interface  
   
    uses  
   
    Windows,   Messages,   SysUtils,   Classes,   Graphics,   Controls,   Forms,   Dialogs,   StdCtrls;  
   
    type  
   
    TForm1   =   class(TForm)  
   
    password:   TEdit;  
   
    Button1:   TButton;  
   
    procedure   Button1Click(Sender:   TObject);  
   
    private  
   
    {   Private   declarations   }  
   
    public  
   
    {   Public   declarations   }  
   
    end;  
   
    var  
   
    Form1:   TForm1;  
   
    flag:boolean;//返回输入密码是否正确  
   
    rightpwd:string;//记录输入参数(正确的密码)  
   
    function   checkpwd(pwd:string):boolean;export;//声明DLL函数  
   
    implementation  
   
    {$R   *.DFM}  
   
    procedure   TForm1.Button1Click(Sender:   TObject);  
   
    begin  
   
    if   password.text=rightpwd   then  
   
    flag:=true;  
   
    form1.close;  
   
    end;  
   
  function   checkpwd(pwd:string):boolean;export;  
   
    begin  
   
    flag:=false;  
   
    rightpwd:=pwd;//读入正确的密码值  
   
    form1:=Tform1.create(Application);//创建密码验证窗口  
   
    form1.ShowModal;//显示窗口  
   
    checkpwd:=flag;  
   
    form1.free;//释放资源  
   
    end;  
   
    end.  
   
  file://主程序main.pas,调用DLL  
   
    unit   main;  
   
    interface  
   
    uses  
   
    Windows,   Messages,   SysUtils,   Classes,   Graphics,   Controls,   Forms,   Dialogs,   StdCtrls;  
   
    type  
   
    TForm1   =   class(TForm)  
   
    jieguo:   TEdit;  
   
    Button1:   TButton;  
   
    procedure   Button1Click(Sender:   TObject);  
   
    private  
   
    {   Private   declarations   }  
   
     public  
   
    {   Public   declarations   }  
   
    end;  
   
    var  
   
    Form1:   TForm1;  
   
    implementation  
   
    function   checkpwd(pwd:string):boolean;external   'project1.dll'   ;//函数说明  
   
    {$R   *.DFM}  
   
    procedure   TForm1.Button1Click(Sender:   TObject);  
   
    begin  
   
    if   checkpwd('congrong')   then//调用函数  
   
    jieguo.text:='true'  
   
    else  
   
    jieguo.text:='false';  
   
    end;  
   
    end.    

基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip 个人大四的毕业设计、课程设计、作业、经导师指导并认可通过的高分设计项目,评审平均分达96.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 [资源说明] 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设或者课设、作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),供学习参考。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值