我的意思是我在dll中的导出函数中调用了api函数,结果我到另一应用程序调用时,他就提示错误,原码如下: dll: library MyDll; uses SysUtils, dialogs, Classes,ShellApi,windows; function Hobbit (value:integer): string; stdcall; begin case value of 1: result := 'Frodo'; 2: result := 'Samwise'; 3: result := 'Pippin'; 4: result := 'Meriadoc'; else result := 'Must be an Orc!'; end; end; function Larger (Val1, Val2: integer): pchar; stdcall; var windir:pchar; begin windir:=char(0); GetWindowsDirectory(windir,128); //获得安装目录 if Val1 > Val2 then result := windir else if Val2 > Val1 then result := windir else result := 'hello'; end; procedure Elephants;stdcall; begin ShowMessage ('Pink Elephants on Parade'); end; exports Hobbit , Larger , Elephants ; begin end. 应用程序: implementation function Hobbit (value:Integer):string; stdcall; external 'MyDll.dll' ; function Larger (val1,val2:Integer): pchar;stdcall; external 'MyDll.dll'; procedure Elephants;stdcall; external 'MyDll.dll'; {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin Memo1.lines.add (Hobbit(5)); end; procedure TForm1.Button2Click(Sender: TObject); begin Memo1.lines.add (string(Larger(12,25)) + ' is larger than 12'); end; procedure TForm1.Button3Click(Sender: TObject); begin Elephants; end; end.出错信息(安button2调用large时) Access violation at address 77f99ef8 in module "ntdll.dll" Write of address 002820f8
function Larger (Val1, Val2: integer): pchar; stdcall; var windir:pchar; begin GetMem(windir, 128);//分配内存 GetWindowsDirectory(windir,128); //获得安装目录 if Val1 > Val2 then result := windir else if Val2 > Val1 then result := windir else result := 'hello'; FreeMem(windir, 128);//释放内存 end;
用exports fun1;进行导出。具体可以找个实例看看就知道了。
dll:
library MyDll;
uses
SysUtils, dialogs, Classes,ShellApi,windows;
function Hobbit (value:integer): string; stdcall;
begin
case value of
1: result := 'Frodo';
2: result := 'Samwise';
3: result := 'Pippin';
4: result := 'Meriadoc';
else
result := 'Must be an Orc!';
end;
end;
function Larger (Val1, Val2: integer): pchar; stdcall;
var
windir:pchar;
begin
windir:=char(0);
GetWindowsDirectory(windir,128); //获得安装目录
if Val1 > Val2 then
result := windir
else if Val2 > Val1 then
result := windir
else
result := 'hello';
end;
procedure Elephants;stdcall;
begin
ShowMessage ('Pink Elephants on Parade');
end;
exports
Hobbit ,
Larger ,
Elephants ;
begin
end.
应用程序:
implementation
function Hobbit (value:Integer):string; stdcall; external 'MyDll.dll' ;
function Larger (val1,val2:Integer): pchar;stdcall; external 'MyDll.dll';
procedure Elephants;stdcall; external 'MyDll.dll';
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.lines.add (Hobbit(5));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Memo1.lines.add (string(Larger(12,25)) + ' is larger than 12');
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Elephants;
end;
end.出错信息(安button2调用large时)
Access violation at address 77f99ef8 in module "ntdll.dll" Write of address 002820f8
2 用dependence看看dll文件的接口/导入/导出是否正确
3 什么错误
用GetMem(windir,128);
var
windir:pchar;
begin
GetMem(windir, 128);//分配内存
GetWindowsDirectory(windir,128); //获得安装目录
if Val1 > Val2 then
result := windir
else if Val2 > Val1 then
result := windir
else
result := 'hello';
FreeMem(windir, 128);//释放内存
end;