文档章节

delphi编写与调用DLL

geek_loser
 geek_loser
发布于 2015/02/03 14:56
字数 504
阅读 440
收藏 2

 delphi编写DLL

下面在delphi中编写一个简单的dll,在该dll中只有一个max函数,返回2个数中的大数(Delphi 5.0)

1、New->DLL;取名为DLL_0001,编写代码:

library dll_0001;

uses
  SysUtils,
  Classes;

{$R *.RES}

function max(x,y:integer):integer;stdcall;
begin
    if(x>y) then
     max :=x
     else
     max :=y;
end;

exports max;

begin

end.

红色部分为自己编写,这里和普通的delphi函数是一样的,只是在返回值中带个stdcall参数,然后用exports把函数导出

================================================================================

Delphi调用dll

调用dll分动态调用和静态调用2中,动态调用写起来简单,安全点,动态调用复杂很多,但很灵活;

现在编写一个程序,来调用上面写的dll_0001.dll文件中的max函数

一、new一个Application,在Form中放入2个TEdit、1个TLabek;

二、

1、静态调用

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    procedure Edit2KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}
function max(x,y:integer):integer;stdcall;
external 'dll_0001.dll';

procedure TForm1.Edit2KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if key =vk_return then
label1.Caption :=IntToStr(max(StrToInt(Edit1.text),StrToInt(edit2.text)));

end;

end.

红色代码自己添加,其中external "dll_name"中的dll_name可以是dll的绝对路径,要是该dll文件在你的搜索路径中,可以直接写文件名,但是.dll不能少写

2、动态调用,代码如下;

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    procedure Edit2KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Edit2KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
type
TFunc =function(x,y:integer):integer;stdcall;
var
Th:Thandle;
Tf:TFunc;
Tp:TFarProc;

begin
if key =vk_return then
begin

Th :=LoadLibrary('dll_0001.dll');   {load dll}
if(Th  >0) then
try
Tp :=GetProcAddress(Th,PChar('max'));
if(Tp <>nil) then
begin        { begin 1}
Tf :=TFunc(Tp);
Label1.Caption :=IntToStr(
Tf(StrToInt(Edit1.text),StrToInt(Edit2.text)));
end  { end 1}
else
  ShowMessage('function max not found.');
finally
FreeLibrary(Th);
end
else
ShowMessage('dll_0001.dll not exsit.');


end;
end;

end.


本文转载自:

geek_loser
粉丝 3
博文 74
码字总数 18849
作品 0
朝阳
私信 提问
Silverlight 5 RC新特性探索系列:12.Silverlight 5 RC 窗口模式下访问自定义DLL和WIN32 API

在Silverlight 5 RC版本中针对访问权限进行了相应的提升,它的项目属性中新增了一个复选框“在浏览器内运行时需要提升的信任”,如下图: 它将为在浏览器模式下运行的应用程序提升一些访问权...

橘子红了呐
2017/11/09
0
0
[MyBean说明书]-如何进行最简单的DEMO

MyBean是轻量级的、绿色的框架,不需要安装任何的组件和携带任何的其他文件,前 期步骤已经相当精简了,仔细阅读完下面简单的五个步骤,就可以编写基于MyBean的插件: 1.加入Delphi的搜索路径...

天地弦
2014/08/30
0
0
Delphi调用 C# 写的webservice

Delphi调用 C# webservice总结 用delphi的THTTPRIO控件调用了c#写的webservice。 下面是我调试时遇到的一些问题: 1:导入wsdl文件:file--new----other----webservice---WSDLimporter---输入...

vga
2014/11/25
445
0
delphi fastMM 使用方法简介

delphi fastMM 使用方法简介 在 http://sourceforge.net/projects/fastmm 中可以下载到最新 stable 的 FastMM,当前推荐的是 4.62,主要特点包括: 1、彻底实现了 Borland 的内存管理器,可以...

vga
2014/08/26
1K
0
[转] Java中调用Delphi编写的DLL

有些时候,要写一些程序,在 JAVA 里面好难实现, 但如果使用其它编程语言却又比较容易时,我们不妨通过 JNI 来让不同语言的程序共同完成. JNI 的教程, 网上 C 的比较多,Java 也提供了 javah.ex...

鉴客
2010/10/28
2.8K
1

没有更多内容

加载失败,请刷新页面

加载更多

将key=value转成对象形式

var params = {};testParan.split(',').forEach(item =>{ var tmpArr = item.split('='); Vue.set(params, tmpArr[0].trim(), tmpArr[1].trim());});Vue.set(params, 'sql', sql);......

沉迷代码我爱学习
6分钟前
1
0
什么是分立器件

  分立器件被广泛应用到消费电子、计算机及外设、网络通信,汽车电子、led显示屏等领域。   半导体产业中有两大分支:集成电路和分立器件。   集成电路   集成电路(integrated circ...

仙溪
17分钟前
1
0
kibana rpm安装

https://www.elastic.co/guide/en/kibana/6.2/rpm.html 下载对应的版本wget https://artifacts.elastic.co/downloads/kibana/kibana-6.2.4-x86_64.rpm 安装 rpm -ivh kibana-6.2.4-x86_64......

看的最远的地方
20分钟前
1
0
高防CDN相比较于高防服务器,为何更加稳定?

对于DDoS攻击,那些已经做过网站、平台的人应该知道,DDoS攻击是非常可怕的,因为这种攻击本质上不能防御,或者DDoS攻击只能被减轻,不能完全消除。DDoS,意思是“分布式拒绝服务”。它是一种...

云漫网络Ruan
20分钟前
1
0
线程SuspendThread() ResumeThread()的使用

SuspendThread():挂起线程 If the function succeeds, the return value is the thread's previous suspend count; otherwise, it is (DWORD) -1. ResumeThread():启动线程 If the functio......

rainbowcode
21分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部