谢谢大家!但我在调试的时候出现了“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;
function test1:integer;external 'mydll';
//直接通过名称调用test1(注意名称大小写敏感)。
function test11:integer;external 'mydll' name 'test1';
//通过名称调用test1,在程序中使用新名称(原名称仍然大小写敏感)。
procedure test2;external 'mydll' index 1;
//通过索引号调用TEST2。程序中可以用与DLL中不一样的名称.
使用外部声明的缺点是程序启动时如果找不到mydll.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;
// 调用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;