有关Dll调用的问题,急急急!(100分)

  • 主题发起人 主题发起人 wlcwe
  • 开始时间 开始时间
W

wlcwe

Unregistered / Unconfirmed
GUEST, unregistred user!
我刚学dll调用,编了个很简单的程序如下
********************
Project1.dll
*******************
library Project1;
uses
SysUtils,
Classes;
{$R *.res}
function a(b:Pchar):pchar; stdcall;
begin
result:=b;
end;
exports
a index 1 name 'mya' resident;
begin
end.

***************
调用dll的exe文件
+++++++++++++++++
.......前面省略
{$R *.dfm}
type
Tc=function(d:Pchar):pchar;

procedure TForm1.Button1Click(Sender: TObject);
var
f:pchar;
e:pchar;
P:Tc;
M:Thandle;
begin
m:=loadlibrary('Project1.dll');

if m<>0 then
p:=Tc(getprocaddress(m,'mya'));
e:=stralloc(80);
e:=strpcopy(e,edit1.Text);

f:=p(e);
edit2.Text:=f;
freelibrary(M);
end;
end.
编译后在Edit1里输如字符串但在edit2中出来的却是乱码,不管怎么输出来的都是'祧h'这个乱吗,快帮帮我啊,急急急急急急急急急急急急急急!!!!
我用的是delphi6,
 
我用Delphi5写过类似的程序,
调用的时候也要加stdcall才行,
不然程序退出时就出错。
 
你没有为 function a(bchar):pchar; stdcall; 的返回值分配内存
function a(bchar):pchar; stdcall;
begin
try//应该加上错误捕捉代码,防止错误从Dll蔓延到主程序
result := stralloc(100);//你没有为返回值分配内存
//result:=b; //这句不对,正确的应该是
strcopy(result,b);//把 b 复制到 Result
except
strpcopy(result,'');
end;
end;

最后应该不需要释放,反正我一直就是这样做的,不出错

f:=p(e); 也不对
strcopy(f,p(e));才是正确方式
还有,你使用pchar变量都没有分配内存释放内存,只有分配了才能使用,使用完了释放
用 stralloc 分配内存;用 strdispose 释放
 
你违背了 DLL 编写的一个基本原则:
不能在 DLL 中分配内存,而在 DLL 外释放内存。

有两个解决方法:
1)把返回值放入参数表并设置缓冲区大小;
2)用 Sharemem.
 
You should in the exe file define
type
Tc=function(d:Pchar):pchar;stdcall;
instead of
type
Tc=function(d:Pchar):pchar;
 
多人接受答案了。
 
后退
顶部