2009-02-25 50 views
4

我需要使用使用.NET框架創建的DLL。此DLL使COM可見。在delphi中使用COM DLL - MSVCR80D.dll錯誤中的訪問衝突

我想用Delphi 2006年我按照以下步驟創建的應用程序使用此DLL:

  1. 註冊使用regscr32的DLL。
  2. 使用 Delphi IDE導入類型庫。它創建了 _TLB.pas文件。簽名後在TLB文件中創建。

     
    function TValidationRequest.Process(var meterBSN: WideString; var NICSerial: WideString; 
                var partNumber: WideString; var otherConfig: WideString; 
                out returnMessage: WideString): Smallint; 
    begin 
        Result := DefaultInterface.Process(meterBSN, NICSerial, partNumber, otherConfig, returnMessage); 
    end; 
    
  3. 我試圖調用使用 下面的代碼段的方法。

 
procedure TForm1.buttonClick(Sender: TObject); 
var 
    valReq: TValidationRequest; 
    s1, s2, s3, s4, s5: WideString; 
    o: WideString; 
begin 
    valReq := TValidationRequest.Create (Self); 
    try 
    valReq.Process (s1, s2, s3, s4, o); 
    MessageDlg(o, mtInformation, [mbOK], 0); 
    finally 
    valReq := nil; 
    end; 
end; 

但是當處理的方法叫我獲得以下錯誤。 alt text http://i41.tinypic.com/2daf1ix.png

請你能提出任何解決方案嗎?

回答

6

嘗試初始化WideStringss1s2s3s4,甚至可能o)。如果我沒有記錯,那麼在設置它們之前,它們在Delphi中是動態的,零(000000000)。

+0

你搖滾MarkusQ!非常感謝。 如果可以的話,我會給你100票。 :) – Hemant 2009-02-25 06:56:26

+0

幹得好!這也是我看到它時發現的。 @Hermant:爲了將來的使用,請記住局部變量(在方法體中聲明)大部分(字符串除外)未初始化,並且可以包含任何內容。全局聲明或作爲類的成員字段聲明的變量被設置爲默認值。 – 2009-02-25 12:02:06

2

除了MarkusQ說的什麼之外,請注意你對TValidationRequest對象的內存管理不太好。使用Create(nil)然後在finally - 塊寫入FreeAndNil(valReq)會更清潔。現在,您每次單擊按鈕時都會創建一個對象,並且它們都將保留在內存中,直到您銷燬表單。至少你不會得到內存泄漏,因爲你將Self傳遞給了構造函數,所以至少這個表單會負責銷燬這些對象。在你的例子中,在TForm1.buttonClick方法結束後,確實不需要保持對象存在。