一个dll中函数引用了api函数,我在程序中调用此dll的函数为何不行?

huangjunli 2003-07-30 11:06:09
如题请说明原因和解决方法。
...全文
50 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jerrymousenet2 2003-07-30
  • 打赏
  • 举报
回复
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;
firetoucher 2003-07-30
  • 打赏
  • 举报
回复
larger中的windir,并没有分配内存
用GetMem(windir,128);
firetoucher 2003-07-30
  • 打赏
  • 举报
回复
1 确定use了windows单元,或者自己写了api得申明
2 用dependence看看dll文件的接口/导入/导出是否正确
3 什么错误

huangjunli 2003-07-30
  • 打赏
  • 举报
回复
我的意思是我在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
jerrymousenet2 2003-07-30
  • 打赏
  • 举报
回复
在程序中只能调用dll中的导出函数。
用exports fun1;进行导出。具体可以找个实例看看就知道了。

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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