焦頭爛額一個上午還是搞不定,跪地相求大家,朋友幫忙啊。。。

來源:互聯網
上載者:User
焦頭爛額一個上午還是搞不定,跪地相求大家,朋友幫忙啊。。。 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中分配

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.