请znxia来帮忙(100)

  • 主题发起人 主题发起人 delphi002
  • 开始时间 开始时间
D

delphi002

Unregistered / Unconfirmed
GUEST, unregistred user!
该贴是你帮忙解决的,但现在有一新问题,假如我要返回的是字符串数组呢?http://www.delphibbs.com/delphibbs/dispq.asp?lid=3957384我现在的这样定义的TMyStrResult=Array of Pchar;PMyStrResult=^TMyStrResult;但返回的结果保存到ADOQUERY时就异常了.是不是定义有问题?
 
问题是我在主程序中不能确定长度,所以无法分配!只有在DLL中,由用户的选择来确定长度.
 
DLL:procedure TestDll(VAR Rst: PMyIntResult); stdcall;var I: integer;begin SetLength(Rst^, 10); for i := 0 to 9 do begin Rst^ := StrNew(PChar(Inttostr(i))); end; end;---------------------Exe:procedure TForm1.Button1Click(Sender: TObject);type TestDll = procedure(VAR Rst: PMyIntResult); stdcall;var DllHandle: THandle; Dllfarproc: TestDll; MyRst: PMyIntResult; i:Integer;begin DllHandle := LoadLibrary('Prjdll.dll'); if DllHandle > 32 then try Dllfarproc := GetProcAddress(DllHandle, 'TestDll'); new(MyRst); if assigned(DllfarProc) then DllfarProc(MyRst); for I:=low(MyRst^) to High(MyRst^) do Memo1.Lines.Add( Strpas(MyRst^) ); finally FreeLibrary(DllHandle); end;end;end.
 
谢谢znxia想问一下,那结构是这样定义吗?TMyStrResult=Array of Pchar;PMyStrResult=^TMyStrResult;
 
嗯,拷贝你的结构体测试的,只是我的函数中参数类型名称需要更改为PMyStrResult
 
再向znxia请教一个问题,如果定义两个变量:Var A :TMyStrResult; B :TMyStrResult;当我给A赋值后,我想直接复制A到B,除了下面的方法外,还有没有更直接,更快的方法For i:=0 to Length(A)-1 do B :=A
 
这种赋值,好像结果是A和B中的元素,指向的是同一块内存区域。PChar之间的复制最好用StrCopy或者StrMove函数(目标PChar已经开辟内存空间了),否则还是用StrNew来赋值比较方便。Setlength(B,Length(A));for i:=low(a) to High(a) do B := StrNew(A);
 
array of 类型,A和B实际上都是指针,所以可以这么写:SetLength(B,Length(A));CopyMemory(Pointer(B), Pointer(A), Length(A));
 
来自:liuls, 时间:2009-5-8 12:19:23, ID:3957409 | 编辑 最好还是从外分配好长度, 在 Dll 里只是赋值!主程序 与 Dll 相当于两个程序, 还是各自管理各自的内存好// ---------------- 个人看法 -------------------------我们可以学一下 C++ 里面用法:DLL type // PMyIntResult = ^TMyIntResult; TMyIntResult = Array of Integer; // AInt 为动态数组首指针, AAssignLen 传入长度, AResultLen 实际要占用长度 // 返加值: 分配长度是否够 function TestDll(APInt: PInteger; const AAssignLen: Integer; var AResultLen: Integer): Boolean;stdcall; begin // .... // .... Result := AAssignLen >= AResultLen; end; exports TestDll;// --------------------------------------------------------------------------// 如果返加 False 可以增加长度再分配, 直到分配长度足够为止! 有很多 windows API 也是这么干的~var PInt: PInteger; IntArr: array of Integer; AssignLen, ResultLen: Integer;begin AssignLen := 10; SetLength(IntArr, AssignLen); try PInt := @IntArr[0]; while not TestDll(PInt, AssignLen, ResultLen) do begin Inc(AssignLen, 10); SetLength(IntArr, AssignLen); end; // 对 取出值处理.... finally IntArr := nil; end;end;// --------------------------------------------------------------------------
 
谢谢三位,特别感谢znxia!
 

Similar threads

回复
0
查看
848
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部