焦頭爛額一個上午還是搞不定,跪地相求大家,朋友幫忙啊。。。 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061218121845242.html
library MYDLL;
uses
sharemem,
SysUtils,
StdCtrls;
var
fjmain : TADODataSet;
type
Tps = Record
sno: integer;
fjcode:pchar;
fjname:pchar;//
End;
Tp=array of Tps;
{$R *.RES}
function Select(transmode:pchar;var PResult:Tp):integer; export; stdcall;
var
fjcode,t1,t2:pchar ;
totalnum:integer;
begin
fjmain:= TADODataSet.Create(nil);
ADO配置過程......(OK的)
fjmain.Connection := ADOConnection;
try
fjmain.Close;
fjmain.CommandText:= 'Select * From fjmain order by fjid';
fjmain.Open;
t1:=pchar(fjMain.fieldbyname('fjcode').asstring);
t2:=pchar(fjMain.fieldbyname('fjname').asstring);
while not fjmain.eof do
begin
if (滿足條件) then
begin
totalnum:=totalnum+1;
setlength(PResult,totalNum);
PResult[totalNum-1].sno:=totalnum;
PResult[totalNum-1].fjcode:=t1;
PResult[totalNum-1].fjname:=t2;
end;
fjmain.next;
end;
Result := totalnum;
finally
fjmain.Free;
CoUnInitialize;
end;
end;
exports
Select;
begin
end.
以上是My Code,現在的問題是
第一:我在fjmain表迴圈的時候,有很多滿足條件的記錄,我看了結果僅僅最後一條記錄中的fjcode,fjname字串是正確的,其他的都是亂78糟的字元,或者是字元的前幾個字母后面的字母是亂碼,為什麼呢?
第二:當我連續兩次調用該DLL的時候,會出現記憶體錯誤,難道我什麼地方沒有釋放字串PCHAR變數,就是t1,t2變數嗎?
這個問題我已經搞了一個上午了,反覆的換pchar,string來試,結果還是有記憶體問題,大家幫我看看程式的什麼地方有問題呢?
totalnum的初始數值是多少
應該不是這個問題,初始值是0 啊
array of 是Delphi特有的開放數組
作為DLL的介面,恐怕有問題的
直接使用fieldbyname().value試試?
totalnum的初始數值?
初始值我說了是0啊,我前面有這樣語句的,我的問題還是在於STRING使用上的問題,因為我一旦去掉 setlength(PResult,totalNum);
PResult[totalNum-1].sno:=totalnum;
PResult[totalNum-1].fjcode:=t1;
PResult[totalNum-1].fjname:=t2;這幾句,怎麼運行都不會出問題的。
1、totalnum的初始值?
2、t1,t2是PChar類型,Pchar是指標,不能用來儲存資料,當fjmain.Next後,應該指向了無效地址空間。
3、array of 是Delphi特有的開放數組,作為DLL的介面,肯定有問題的。
4、在迴圈中反覆使用setlength(PResult,totalNum);分配記憶體空間,可能造成前面已經賦值的記錄資料丟失,造成亂碼
謝謝以上各位兄弟們的關心和回答,儘管我問題還沒有完全處理掉,但給我了很好的思路,先結帖,順便關於下面的這個問題,問下大哥:
3、array of 是Delphi特有的開放數組,作為DLL的介面,肯定有問題的。
(我ARRAY OF只在函數中單獨定義單獨使用,不作為DLL程式和外界程式的介面,可以使用嗎?)
我ARRAY OF只在函數中單獨定義單獨使用,不作為DLL程式和外界程式的介面,可以使用嗎?
===================================================================================
那應該沒問題的,另外需要指出的是,輸出記錄地址最好由程式調用Dll函數前分配,不要在Dll中分配