dll 数组输出和调用有关问题
dll 数组输出和调用问题!
-----------dll部分--------------------
type
TMyVal = Array [1..2] of Pchar;
function redryxx():TMyVal;stdcall;
var
aArr: TMyVal;
aPointer: ^TMyVal;
adocn : TAdoConnection ;
adoqry : TADOQuery ;
begin
adocn := TAdoConnection.Create(nil);
adocn.ConnectionString := datasys ;
adocn.LoginPrompt := false ;
adocn.Open();
adoqry := Tadoquery.Create(nil);
adoqry.Connection := adocn ;
adoqry.SQL.Add( 'SELECT * FROM xm ');
adoqry.Open;
while not adoqry.Eof do
begin
ls_rtn := adoqry.FieldbyName( 'xm').asstring;
ls_bh := adoqry.FieldbyName( 'yy').asstring;
aArr[1] :=pchar(ls_rtn);
aArr[2] :=pchar(ls_tjbh);
adoqry.Next ;
end;
aPointer := @aArr;
Result := aPointer^;
adoqry.Close;
adoqry.Free;
adocn.Close;
adocn.Free;
end;
=============EXE调用部分==========================
procedure dd.Button2Click(Sender: TObject);
type
TMyVal = Array [1..2] of Pchar;
Tredryxx = function():TMyVal;stdcall ;
var
DllHandle: THandle;
procaddr: Tredryxx;
p1:pchar;
begin
DllHandle := LoadLibrary('datadll.dll');
@ProcAddr := GetProcAddress(DllHandle, 'redryxx');
if @ProcAddr <> nil then
begin
p1:=ProcAddr[1];//此处报错,似乎取的不对。。。。。
end;
end;
大家帮忙看看问题错在那了!!!!!!!!!!!!
------解决方案--------------------
function redryxx():TMyVal;stdcall;
改成
procedure redryxx(var Result : TMyVal);stdcall;
调用处相应修改
------解决方案--------------------
看似没问题啊,是不是未返回结果之前的数据就是错误的
调用不变; 把dll改一下做个简单的测试:
type
TMyVal = Array [1..2] of Pchar;
function redryxx():TMyVal;stdcall;
var
aArr: TMyVal;
aPointer: ^TMyVal;
begin
aArr[1] :='A';
aArr[2] :='B';
aPointer := @aArr;
Result := aPointer^;
end;
可以不用指针aPointer,直接Result:=aArr;
-----------dll部分--------------------
type
TMyVal = Array [1..2] of Pchar;
function redryxx():TMyVal;stdcall;
var
aArr: TMyVal;
aPointer: ^TMyVal;
adocn : TAdoConnection ;
adoqry : TADOQuery ;
begin
adocn := TAdoConnection.Create(nil);
adocn.ConnectionString := datasys ;
adocn.LoginPrompt := false ;
adocn.Open();
adoqry := Tadoquery.Create(nil);
adoqry.Connection := adocn ;
adoqry.SQL.Add( 'SELECT * FROM xm ');
adoqry.Open;
while not adoqry.Eof do
begin
ls_rtn := adoqry.FieldbyName( 'xm').asstring;
ls_bh := adoqry.FieldbyName( 'yy').asstring;
aArr[1] :=pchar(ls_rtn);
aArr[2] :=pchar(ls_tjbh);
adoqry.Next ;
end;
aPointer := @aArr;
Result := aPointer^;
adoqry.Close;
adoqry.Free;
adocn.Close;
adocn.Free;
end;
=============EXE调用部分==========================
procedure dd.Button2Click(Sender: TObject);
type
TMyVal = Array [1..2] of Pchar;
Tredryxx = function():TMyVal;stdcall ;
var
DllHandle: THandle;
procaddr: Tredryxx;
p1:pchar;
begin
DllHandle := LoadLibrary('datadll.dll');
@ProcAddr := GetProcAddress(DllHandle, 'redryxx');
if @ProcAddr <> nil then
begin
p1:=ProcAddr[1];//此处报错,似乎取的不对。。。。。
end;
end;
大家帮忙看看问题错在那了!!!!!!!!!!!!
------解决方案--------------------
function redryxx():TMyVal;stdcall;
改成
procedure redryxx(var Result : TMyVal);stdcall;
调用处相应修改
------解决方案--------------------
看似没问题啊,是不是未返回结果之前的数据就是错误的
调用不变; 把dll改一下做个简单的测试:
type
TMyVal = Array [1..2] of Pchar;
function redryxx():TMyVal;stdcall;
var
aArr: TMyVal;
aPointer: ^TMyVal;
begin
aArr[1] :='A';
aArr[2] :='B';
aPointer := @aArr;
Result := aPointer^;
end;
可以不用指针aPointer,直接Result:=aArr;