簡體   English   中英

在 delphi 中使用 COM DLL - MSVCR80D.Z06416233FE2EC48AFE1Z3 中的訪問錯誤1

[英]Using a COM DLL in delphi - Access violation in MSVCR80D.dll error

我需要使用使用 .NET 框架創建的 DLL。 這個 DLL 是 COM 可見。

我想在使用 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; 開始結果:= DefaultInterface.Process(meterBSN,NICSerial,partNumber,otherConfig,returnMessage); 結尾;
  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;

但是當調用 Process 方法時出現以下錯誤。 替代文字

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

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

除了 MarkusQ 所說的,請注意您的TValidationRequest object 的 memory 管理不太好。 使用Create(nil)然后在finally塊中寫入FreeAndNil(valReq)會更干凈。 現在的方式是每次單擊按鈕時創建一個TValidationRequest object,它們都將保留在 memory 中,直到您銷毀表單。 至少您不會得到 memory 泄漏,因為您將Self傳遞給構造函數,因此至少表單將負責銷毀這些對象。 在您的示例中,確實沒有必要在TForm1.buttonClick方法結束后讓 object 保持活動狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM