一个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,
 
解决办法:
1)不要在 DLL 中输出 char* (PChar) 类型的数据;
而应该改为:function a(b:Pchar
buffer:pchar
size: longint): boolean
stdcall;
即必须分配一段内存给返回。如果你需要直接对变量地址进行访问,象这种情况,没有必要
写成 DLL 处理。它只会给你带来麻烦而不是方便。

2)使用 ShareMem。
用了这个东西,你可以就象在 Delphi 内部写过程一样写 DLL 和传递参数。
 
把调用部分的p声明为
p:TFarProc;
试试
 
ddev,问题不是出在输出,如果把result:=b;改成result:='abc'那它反回的会是abc了。
而是出在参数调入时,好象不能正确调入啊
 
我的天声明函数的时候请用stdcall;
而切对于Pchar这种类型还是增加一个长度得参数吧!这样访问就有边界了!
 
去掉DLL中语句a index 1 name 'mya' resident;中的resident,改为a index 1 name 'mya'
 
都试过了,还是不行啊
 
p:=GetProcAddress(M,'mya');
 
lentilz帮我解决了,是在exe文件中定议调用函数时没把stdcall放上去
 
后退
顶部