我自己写了几个dll,应该怎么调用他们,能写一个函数实现吗?

azheok 2003-09-22 05:15:27
给我一个例子吧,成了,马上给分!!!
...全文
88 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
nyf1220 2003-09-23
  • 打赏
  • 举报
回复
都说完了!
2312 2003-09-23
  • 打赏
  • 举报
回复
内存泄露Memory Leak肯定是有指针或对象没有Free,

资源不足多半因为有BMP对象没free

自己创建的dll必须自己释放掉。
可以在创建时把dll加入到一个TList中去。需要释放的时候,只需要检查
TList中是否有元素,有则逐个释放之。注意TList.Free的时候,不会自动
释放掉List中的对象的。
myling 2003-09-23
  • 打赏
  • 举报
回复
@GetTime := GetProcAddress(Handle, 'GetTime');// 'GetTime'是什么意思?


我的一个dll ,对应多个函数名,怎样一个个取到呢?


这个就是Dll导出的函数名,呵呵
FrameSniper 2003-09-23
  • 打赏
  • 举报
回复
是你Dll中的函数名称
azheok 2003-09-23
  • 打赏
  • 举报
回复
谢谢大家!但我在调试的时候出现了“accsee violation at 00X000000",cpu 地址错误。不知道为什么?我把我调试的代码给大家看看

procedure TForm1.Button2Click(Sender: TObject);
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 ,对应多个函数名,怎样一个个取到呢?各位高手麻烦再帮我看看!!
2312 2003-09-23
  • 打赏
  • 举报
回复
你再USES中引用 StdCtrls了吗?
给你一个例子:
unit ttt;

interface

uses
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.
要不行的话,把代码贴出来,帮你看看
azheok 2003-09-23
  • 打赏
  • 举报
回复
@GetTime := GetProcAddress(Handle, '我的函数');

这句话执行后,就会出现 “accsee violation at 00X000000",cpu 地址错误。请问 GetProcAddress是什么函数,请高手帮我解决。谢谢!!
47522341 2003-09-22
  • 打赏
  • 举报
回复
^_^
wcmwcm 2003-09-22
  • 打赏
  • 举报
回复
同意楼上。
楼主结贴吧,楼上已答正解了。
wwle 2003-09-22
  • 打赏
  • 举报
回复
up
PrgmLover 2003-09-22
  • 打赏
  • 举报
回复
同意楼上。
楼主结贴吧,楼上已答正解了。
yzykjh 2003-09-22
  • 打赏
  • 举报
回复
楼上的都讲了,我无话可说。
2312 2003-09-22
  • 打赏
  • 举报
回复
有两种方法
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;
bluespy 2003-09-22
  • 打赏
  • 举报
回复
如何调用DLL
  在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;
bluespy 2003-09-22
  • 打赏
  • 举报
回复
// 调用dll
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;

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧