DLL问题(200分)

  • 主题发起人 主题发起人 Marlowe
  • 开始时间 开始时间
M

Marlowe

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一组函数,放在Unit里运行没问题,可放在DLL中,再从程序中调用
就报错(说指针使用不正确).
请诸位帮忙看看。
<另外,我用Delphi也几年了,应该不会犯太简单的错误>
下面是源码

function ReadValue (Path , ValueName : string ) : string
export;
var
Reg : Tregistry;
begin
if Length (Path) =0 then
begin
Result := '';
exit;
end;
try
reg := Tregistry.create;
Reg.RootKey := HKey_Local_machine;
if (Reg.OpenKey (Path,False)) and (ValueName<>'') then
Result := Reg.ReadString(ValueName);
finally
Reg.Free;
end;
end;
 
不会是太简单的错误……可是除了STRING外,没有其他的指针了啊?
那么,简单的错误:ShareMem,你肯定是不会犯的了吧?
 
你是怎么调的这个DLL?
 
在dll调用中,如果的dll中有全局变量,那就很容易出错
 
微小改动:
function ReadValue (var Path , ValueName : string ) : string
export;

我在D5中编译并引用通过的DLL:

library MYDLL1;

uses
Windows,
SysUtils,
Registry;

function ReadValue (var Path , ValueName : string ) : string
export;
var
Reg : Tregistry;
begin
if Length (Path) =0 then
begin
Result := '';
exit;
end;
try
reg := Tregistry.create;
Reg.RootKey := HKey_Local_machine;
if (Reg.OpenKey (Path,False)) and (ValueName<>'') then
Result := Reg.ReadString(ValueName);
finally
Reg.Free;
end;
end;

exports
ReadValue name 'ReadValue';


begin
end.
 
应该这样写,试了一下,没有问题。

procedure ReadValue (Path , ValueName : String
var ReturnStr: LPSTR)
export
stdcall;
var
Reg : Tregistry;
begin
if Length (Path) =0 then begin
ReturnStr := nil;
exit;
end;
try
reg := Tregistry.create;
Reg.RootKey := HKey_Local_machine;
if (Reg.OpenKey (Path,False)) and (ValueName<>'') then
ReturnStr := PChar(Reg.ReadString(ValueName));
finally
Reg.Free;
end;
end;

调用:

procedure ReadValue (Path , ValueName : String
var ReturnStr: LPSTR)

stdcall;external 'your.dll';
procedure TForm1.Button1Click(Sender: TObject);
var p:LPSTR;
begin
GetMem(p,MAX_PATH);
readvalue('/network/logon','username',p);
Caption:=String(p);
end;

注意不要在DLL中返回不定长的String.
 
感谢诸位,o*o的方法是正确的。看来最好还是别从Dll中返回String
 

Similar threads

S
回复
0
查看
784
SUNSTONE的Delphi笔记
S
S
回复
0
查看
750
SUNSTONE的Delphi笔记
S
S
回复
0
查看
652
SUNSTONE的Delphi笔记
S
S
回复
0
查看
675
SUNSTONE的Delphi笔记
S
后退
顶部