繁体   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