zoukankan      html  css  js  c++  java
  • Delphi调用C写的dll

    一.用C语言写了一个Dll,编译成功。
    是一个非常简单的加密算法,代码如下:
    #include<stdio.h>
    __declspec(dllexport) void Encipher(char a[16])  
    {
     int i,len;
     int s=1;    
     len=strlen(a);
     for(i=0;i<len;i++)
     {
      a[i]=a[i]+s;
      s=s+2;
     }     
    }

    现在我在Delphi中如何调用它并实现这样的功能,点击Button1,获取edit1.text的内容,存于数组中,然后调用Dll中的函数,进行简单加密,然后将结果赋给edit2.text。

    type
      TArrChar = array[0..15] of char;
    procedure Encipher(a:TArrChar);cdecl;external 'xxx.dll';

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    var
      a:TArrChar;
    begin
      CopyMemory(@a,@Edit1.text[1],16);
      Encipher(a);
      Edit2.Text:=a;
    end;

    Delphi中对VC中DLL文件的调用!

    Delphi以其独特的面向控件的开发方式、强大的数据库功能、快速的编译技术以及简单易学的编程特性,使得它自发布之日起即格外引人注目,许多程序员也因此将它作为首选的开发工具。然而,Delphi在科学计算、低端编程等方面的功能不如VC++。VC++功能强大、齐全,但是整个系统比较复杂、庞大,尤其对于初学者来说比较难学,其用户界面的开发远不如Delphi那样方便、快捷。那么,我们能否将两者的优点结合起来呢?答案是肯定的!具体做法是:将涉及到比较低级的操作、计算等方面的程序用VC++写成函数放在动态链接库中,而涉及到界面及与用户交互的编程则用Delphi来实现,最后只需在Delphi中调用VC++编写的动态链接库即可。 
     
    二、动态链接库简介  
            动态链接库(DLL,即“Dynamic-Link   Library”)是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源。DLL是Windows的基石,所有的Win32   API函数都包含在DLL中。  
    使用DLL有许多优点:    
    1、一个DLL可以提供给不同的程序使用,如果有多个程序使用相同的DLL,也只需将DLL在内存中装载一次,这样就节省了内存开销。  
    2、DLL可以使我们的编程更加模块化,将功能相对独立的模块编成一个动态链接库,这样改动程序时不需将整个程序重新编译,只需重新编译所改动的模块。    
    3、使用了DLL组件包可以大大减小可执行文件的规模。    
    4、对于一个大型的、不断更新的应用程序,可以将许多重复的功能写成DLL,用主程序调用,这样既减少了开发的工作量,又提高了访问速度。    
    5、DLL独立于编程语言,大多数WINDOWS编程环境都允许主程序调用DLL中的函数。即可以用VC++、VB、PowerBuilder、Delphi、汇编语言等建立DLL,然后在不同语言编制的应用程序中调用它。这样就给多人使用不同的编程语言开发项目提供了极大的方便。   
     
    三、在Delphi中调用VC++创建的动态链接库的实例  
    (一)实验环境  
    本实例的编程工具及运行环境为:Windows   98,VC++6.0,Delphi   5.0 。
     
    (二)实验内容  
    1.用VC++6.0建立一个动态链接库MaxMin.DLL,该库中包含有两个函数:返回三个整数中最大整数的函数Max1(   )和返回三个整数中最小整数的函数Min1(   )。  
    2.用Delphi编写测试程序调用动态链接库MaxMin.DLL中的两个函数。
     
    (三)实验步骤  
    1.用VC++6.0建立动态链接库MaxMin.DLL  
    第一步:启动VC++6.0,选择“File/New/MFC   AppWizzard(Dll)”,工程名设为“MaxMin”,按“确定”钮后,选择“Regular   DLL   Using   shared   MFC   DLL”,按“Finish”钮后,即创造了一个DLL的框架工程。  
    第二步:选择“File/New”,在出现的对话框中选择“C/C++   Header   File”,在文件名处输入“MyDLL”,按“确定”钮,即创建了一个空的头文件“MyDLL.h”。在该文件中输入以下两行内容:  
    extern   "C "   _declspec(dllexport)   int   Min1(int   x,int   y,int   z);  
    extern   "C "   _declspec(dllexport)   int   Max1(int   x,int   y,int   z);  
    选择“File/Save”保存该文件的内容。  
    第三步:选择“File/New”,在出现的对话框中选择“C/C++   Source   File”,   在文件名处输入“MyDLL”,按“确定”钮,即创建了一个空的源文件“MyDLL.cpp”。在该文件中输入以下内容:  
    #include   "stdafx.h "  
    #include   "MyDll.h "  
    extern   "C "   __declspec(dllexport)   int   Min1(int   x,int   y,int   z)  
    {  
    if   ((x <=y)   &   (x <=z))   return   x;  
    else   if   ((y <=x)   &   (y <=z))   return   y;  
    else   return   z;   /*找出x,y,z中的最小整数*/  
    }  
     
    extern   "C "   __declspec(dllexport)   int   Max1(int   x,int   y,int   z)  
    {  
    if   ((x> =y)   &   (x> =z))   return   x;  
    else   if   ((y> =x)   &   (y> =z))   return   y;  
    else   return   z;   /*找出x,y,z中的最大整数*/  
    }  
    选择“File/Save”保存该文件的内容。  
    第四步:按下运行图标“!”,即生成了MyDLL.DLL(在当前工程目录的DEBUG子目录下)。  
     
    2.用Delphi编写调用MaxMin.DLL的测试程序  
    调用动态链接库有两种方法,即隐式调用和显式调用。  
    (1)隐式调用  
    第一步:启动Delphi,选择“New   Application”,生成一个空的应用程序,在Form的“Name”属性处输入“TestVcDLLForm”,Caption属性处输入“VC++的DLL隐式调用测试”,在Form中放入控件如表1所示(其中所有的Edit控件的“Text”属性均设为空):  
        最后设计的Form的屏幕效果如图1所示。选择“File/Save   all”,在“Save   unit1   as”对话框中将源文件名设为“main.pas”,按“保存”钮;在“Save   Project1   as”对话框中将工程名设为“TestVcDLL”,按“保存”钮。  
    第二步:选择“File/New…”,在出现的“New   Item”对话框中选择“unit”,按“OK”钮,生成一个空的源文件,在该文件中输入以下内容:  
    unit   MaxMin;  
     
    interface  
    function   Min1(x,y,z:Integer):Integer;   stdcall;  
    function   Max1(x,y,z:Integer):Integer;   stdcall;  
     
    implementation  
    function   Min1;external   'MaxMin.DLL '   name   'Min1 ';  
    function   Max1;external   Max 'Min.DLL '   name   'Max1 ';  
    end.  
    选择“File/Save   As…”,将上述文件存为“MaxMin.pas”。  
    第三步:在Main.pas文件中,在“implementation”语句后加入:  
    uses  
    MaxMin;  
    第四步:在Form上双击“运行”按钮对该按钮的“Click”事件编程,代码如下:  
    procedure   TTestVcDLLForm.btnRunClick(Sender:   TObject);  
    begin  
    edtMax.Text:=IntToStr(Max1(StrToInt(edtInt1.Text),  
    StrToInt(edtInt2.Text),StrToInt(edtInt3.Text)));   //调用动态链接库中的函数Max1  
    edtMin.Text:=IntToStr(Min1(StrToInt(edtInt1.Text),  
    StrToInt(edtInt2.Text),StrToInt(edtInt3.Text)));   //调用动态链接库中的函数Min1  
    end;  
    保存该文件。  
    第五步:将上述1.中VC++6所建立的动态链接库“MaxMin.DLL”拷入Delphi的当前工作目录中。  
    第六步:运行。
       
    (2)显示调用  
    第一步:同隐式调用。只是将Form的“Caption”属性改为“VC++的DLL显式调用测试”。  
    第二步:选择“File/New…”,在出现的“New   Item”对话框中选择“unit”,按“OK”钮,生成一个空的源文件,在该文件中输入以下内容:  
    unit   Unit1;  
     
    interface  
     
    type  
    TMin1=function(x,y,z:Integer):Integer;   stdcall;  
    TMax1=function(x,y,z:Integer):Integer;   stdcall;  
    THandle=Integer;  
     
    implementation  
     
    end.  
    选择“File/Save   As…”,将上述文件存为“MaxMin.pas”。  
    第三步:在Main.pas文件中,在“implementation”语句后加入:  
    uses  
    MaxMin;  
    第四步:在Form上双击“运行”按钮对该按钮的“Click”事件编程,代码如下:  
    procedure   TTestVcDLLForm.btnRunClick(Sender:   TObject);  
    var  
    Handle:THandle;  
    Min1:TMin1;  
    Max1:TMax1;  
    begin  
    Handle:=LoadLibrary( 'MaxMin.dll ');   //将“MaxMin.dll”的文件映象映射进调用进程的地址空间  
    if   Handle <> 0   then  
    begin  
    @Min1:=GetProcAddress(Handle, 'Min1 ');   //取得DLL中函数Min1(   )的地址  
    @Max1:=GetProcAddress(Handle, 'Max1 ');   //取得DLL中函数Max1(   )的地址  
    if   (@Min1 <> nil)   and   (@Min1 <> nil)   then  
    begin  
    edtMin.Text:=IntToStr(Min1(StrToInt(edtInt1.Text),  
    StrToInt(edtInt2.Text),StrToInt(edtInt3.Text)));   //调用动态链接库中的函数Min1  
    edtMax.Text:=IntToStr(Max1(StrToInt(edtInt1.Text),  
    StrToInt(edtInt2.Text),StrToInt(edtInt3.Text)));   //调用动态链接库中的函数Max1  
    end   else   ShowMessage( '调用函数“GetProcAddress”时出错! ');  
    FreeLibrary(Handle);   //从进程的地址空间中解除“MaxMin.dll”文件的映射  
    end;  
    end;  
    保存该文件。  
    第五步:将上述1.中VC++6所建立的动态链接库“MaxMin.DLL”拷入Delphi的当前工作目录中。  
    第六步:运行。

  • 相关阅读:
    BZOJ4346 : [POI2016]Nadajniki
    BZOJ4345 : [POI2016]Korale
    BZOJ4134 : ljw和lzr的hack比赛
    BZOJ4342 : CF348 Pilgrims
    BZOJ2310 : ParkII
    BZOJ3322 : [Scoi2013]摩托车交易
    BZOJ1444 : [Jsoi2009]有趣的游戏
    Xcode8中处理打印日志的配置
    iOS开发之记录用户登录状态
    热修复
  • 原文地址:https://www.cnblogs.com/djcsch2001/p/1780992.html
Copyright © 2011-2022 走看看