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;
我的意思是我在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