焦头烂额一个上午还是搞不定,跪地相求大家,朋友帮忙啊。。。
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. ?
? ?
? 以上是我的代碼,現(xiàn)在的問題是 ?
? 第一:我在fjmain表循環(huán)的時候,有很多滿足條件的記錄,我看了結(jié)果僅僅最后一條記錄中的fjcode,fjname字符串是正確的,其他的都是亂78糟的字符,或者是字符的前幾個字母后面的字母是亂碼,為什么呢? ?
? 第二:當(dāng)我連續(xù)兩次調(diào)用該DLL的時候,會出現(xiàn)內(nèi)存錯誤,難道我什么地方?jīng)]有釋放字符串PCHAR變量,就是t1,t2變量么? ?
? ?
? 這個問題我已經(jīng)搞了一個上午了,反復(fù)的換pchar,string來試,結(jié)果還是有內(nèi)存問題,大家?guī)臀铱纯闯绦虻氖裁吹胤接袉栴}呢?
totalnum的初始數(shù)值是多少
應(yīng)該不是這個問題,初始值是0 ? 啊
array ? of ? 是Delphi特有的開放數(shù)組 ?
? 作為DLL的接口,恐怕有問題的
直接使用fieldbyname().value試試?
totalnum的初始數(shù)值?
初始值我說了是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是指針,不能用來保存數(shù)據(jù),當(dāng)fjmain.Next后,應(yīng)該指向了無效地址空間。 ?
? 3、array ? of ? 是Delphi特有的開放數(shù)組,作為DLL的接口,肯定有問題的。 ?
? 4、在循環(huán)中反復(fù)使用setlength(PResult,totalNum);分配內(nèi)存空間,可能造成前面已經(jīng)賦值的記錄數(shù)據(jù)丟失,造成亂碼
謝謝以上各位兄弟們的關(guān)心和回答,盡管我問題還沒有完全處理掉,但給我了很好的思路,先結(jié)帖,順便關(guān)于下面的這個問題,問下大哥: ?
? 3、array ? of ? 是Delphi特有的開放數(shù)組,作為DLL的接口,肯定有問題的。 ?
? (我ARRAY ? OF只在函數(shù)中單獨定義單獨使用,不作為DLL程序和外界程序的接口,可以使用么?) ?
?
我ARRAY ? OF只在函數(shù)中單獨定義單獨使用,不作為DLL程序和外界程序的接口,可以使用么? ?
? =================================================================================== ?
? 那應(yīng)該沒問題的,另外需要指出的是,輸出記錄地址最好由程序調(diào)用Dll函數(shù)前分配,不要在Dll中分配
總結(jié)
以上是生活随笔為你收集整理的焦头烂额一个上午还是搞不定,跪地相求大家,朋友帮忙啊。。。的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。