bluerain,请进!(300分)

  • 主题发起人 主题发起人 hqz
  • 开始时间 开始时间
H

hqz

Unregistered / Unconfirmed
GUEST, unregistred user!
bluerain,你好!
最近我想学"DDL动态连接库"方面的编程,看了一本书,这本书讲得挺深奥.
我想请你谈谈怎么做,并给一个示例程序.
 
也欢迎大家发言!
 
DLL动态连接库有很多中不同类型。这方面是需要注意的地方。至于编程实现,反倒是
次要的,概念最重要。
在Delphi方面的可能要让你失望了,因为习惯的问题,我一般DLL都是用VC做的。
在VC中一般分为三种:
1.Regular DLL with statically linked
例如lib
2.Regualr DLL using shared MFC dll
现在比较常用的DLL,其好处是并不把一些资源编译进去,而是在调用的时候再去连接
3.MFC extension DLL(using shared MFC DLL)
这种DLL可以包含窗体等类调用,但是在(各中不同语言的)兼容性上会有一些问题。
其实看一下用VB做的工程,好多都是这种类型。
对于Delphi来说,也应该有类似的这种分类。
至于示例程序,我就不给了,实在是怕误导你,因为要实现简单的DLL,你用任何一本
有DLL内容的Delphi书上讲的,在一分钟之内就可以编出来,而稍微有点意思的DLL,
我也是外行,抱歉。
 
谢谢你的肺腑之言!
我想再听听别的"专家"之言,然后再结束这个问题,好吗?
 
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
Edit2: TEdit;
Label2: TLabel;
Label3: TLabel;
Edit3: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Tspace_dot=function(str:string):integer;stdcall;
Tdeal_dot=function(str:string):string; stdcall;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
handle:THandle;
spacedot:Tspace_dot;
dealdot:Tdeal_dot;
begin
handle:=LoadLibraryEx('mydll',0,LOAD_LIBRARY_AS_DATAFILE);
if handle<>0 then
begin
@spacedot:=GetProcAddress(Handle,'space_dot');
@dealdot:=GetProcAddress(Handle,'deal_dot');
if @spacedot<>nil then
Edit2.Text:=inttostr(spacedot(Edit1.text));
if @dealdot<>nil then
Edit3.text:=dealdot(Edit1.text);
end;
FreeLibrary(Handle);
end;

能否帮我看一下这个动态调用Dll的问题,我的两个函数space_dot和deal_dot居然未调用?
@spacedot:=GetProcAddress(Handle,'space_dot');
@dealdot:=GetProcAddress(Handle,'deal_dot');
if @spacedot<>nil then
Edit2.Text:=inttostr(spacedot(Edit1.text));
if @dealdot<>nil then
Edit3.text:=dealdot(Edit1.text);
 
没人会吗:为什么 @spacedot和@dealdot读等于nil
 
你好像把问题复杂化了,另外字符串参数最好用pchar类型,而不要用string.具体原因
如下:
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
关于使用dll的资料你可以到
http://nihao.dlut.edu.cn/web/book/去找一下
上面的一本<<Delphi 5编程实例与技巧 >> chap6 有关于dll入门的一些介绍

还是给你一个简单例子吧:
==============
dll source
==============
library mydll;
uses
SysUtils,
Classes;

{$R *.RES}

function Tspace_dot(str:pchar):integer;stdcall;
begin
result := length(str);
end;

function Tdeal_dot(str:pchar):pchar; stdcall;
begin
result := str;
end;

exports
Tspace_dot index 1,
Tdeal_dot index 2;

begin
end.

===============
load dll demo
===============
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
function Tspace_dot(str:pchar):integer;stdcall;external'mydll.dll';
function Tdeal_dot(str:pchar):pchar;stdcall;external'mydll.dll';

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.text := inttostr(Tspace_dot('abcd'));
edit2.text := Tdeal_dot('abcd');
end;

end.

 
谢谢你指给我一个很好的网站.
不过我想问一下:PDF格式文件用什么软件打开?
 
谢谢!我知道了
 
acrobat reader.
你可以到
http://www.kaiyuangroup.com/glb/ddy/xsbg/downloads/bbrj/hjxl.htm
下载5.0中文版.
 

Similar threads

后退
顶部