给我一个例子吧,成了,马上给分!!!
解决方案 »
- 动态创建控件的问题,来者有分!
- 请问TApplication.OnMessage、WndProc和TApplicationEvents的不同?
- 请教一下如何从ACCESS数据库OLE对象字段中读取JPG图片
- 简单的界面问题~ 散分了
- fastreport问题,高手帮下忙呀。。。
- 在DELPHI中日期查询的SQL语句该怎样写?
- 怎么判断文本框里输入的值不是数值型!
- Select field3,SUM(Field1+Field2) AS SS from tablename gropu by field3+field4 是否正确?
- 问个关于FastReport很菜的问题:
- 谁有Raize Components Version 2.52?
- 怎样让程序在任务栏不显示图标和标题!谢谢!急!!!
- 打包时有什么文件可以不要
procedure TForm1.Button3Click(Sender: TObject);
var
handle:Thandle;
show_sj: procedure;
begin
handle:=loadlibrary('sj.dll');
if handle<>0 then
begin
@show_sj := GetProcAddress(handle, 'show_sj');
if @show_sj <> nil then
show_sj;
freelibrary(handle);
end;
end;
在Delphi中有两种方法调用DLL中的函数和过程,即外部声明或者动态加载。<1>外部声明
在Delphi中外部声明是访问外部例程最容易和最常用的方式,有两种声明方式:通过名字、通过索引号。举例如下:在MYDLL.DLL中有两个函数和一个过程,则其外部声明可以写成:function test1:integer;external 'mydll';
//直接通过名称调用test1(注意名称大小写敏感)。
function test11:integer;external 'mydll' name 'test1';
//通过名称调用test1,在程序中使用新名称(原名称仍然大小写敏感)。
procedure test2;external 'mydll' index 1;
//通过索引号调用TEST2。程序中可以用与DLL中不一样的名称.
使用外部声明的缺点是程序启动时如果找不到mydll.dll将无法运行,即使没有调用其中的模块。 动态加载的方法可以避免这种情况。<2>动态加载
通过调用Windows API中的相关函数,将DLL调入内存并获得指向函数或过程的指针,执行完模块后释放内存。除了节约内存外,这种方法的一个很大的优点是能处理找不到dll或者在装入过程中出错的情况。这样即使某个dll有问题,应用程序的其他部分仍然能够正常运行。动态加载的例子如下:var hDll:THandle;
Test1:function:integer;
begin
hDll:=LoadLibrary('mydll.dll');
if hDll<32 then exit;//如果Dll无法加载则跳出
@Test1:=GetProcAddress(hDll,MakeIntResource(1));
//取得mydll中的第一个函数的地址。
...
FreeLibrary(hDll);
end;
1.静态调用:
procedure DoSomething; external 'MYLIB.DLL';
function SomeFunction(S: string): string; external 'strlib.dll';
2.动态调用;
先声明一个过程指针变量
TGetTime = procedure(var Time: TTimeRec);
在程序中
var
Handle: THandle;
GetTime: TGetTime;
begin
Handle := LoadLibrary('libraryname.dll');
if Handle <> 0 then
begin
@GetTime := GetProcAddress(Handle, 'GetTime');//gettime 是动态连接库中的函数
if @GetTime <> nil then
begin
GetTime();
end;
FreeLibrary(Handle);
end;
end;
var
Handle: THandle;
GetTime: procedure;
begin
Handle := LoadLibrary('mispj20.dll');
//showmessage(inttostr(Handle));
if Handle <> 0 then
begin
@GetTime := GetProcAddress(Handle, 'GetTime');// 'GetTime'是什么意思?
if @GetTime <> nil then
begin
GetTime();
end;
FreeLibrary(Handle);
end;
end;
我的一个dll ,对应多个函数名,怎样一个个取到呢?各位高手麻烦再帮我看看!!
我的一个dll ,对应多个函数名,怎样一个个取到呢?
这个就是Dll导出的函数名,呵呵
可以在创建时把dll加入到一个TList中去。需要释放的时候,只需要检查
TList中是否有元素,有则逐个释放之。注意TList.Free的时候,不会自动
释放掉List中的对象的。
给你一个例子:
unit ttt;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TFuncOne = Function (I : Integer) : Integer; [red]stdcall;[/red] //注意这个
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
pf : TFuncOne ;
mh : THandle;
begin
mh := LoadLibrary(PChar('TTTD.dll')) ;
if mh <> 0 then
begin
@Pf := GetProcAddress(mh,'One') ;
ShowMessage(IntToStr(pf(0))) ;
FreeLibrary(mh);
end;
end;end.
要不行的话,把代码贴出来,帮你看看