[英]Using a COM DLL in delphi - Access violation in MSVCR80D.dll error
我需要使用使用 .NET 框架创建的 DLL。 这个 DLL 是 COM 可见。
我想在使用 Delphi 2006 创建的应用程序中使用此 DLL。我遵循以下步骤:
使用 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); 结尾;
我尝试使用以下代码片段调用该方法。
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;
请问您能提出任何解决方案吗?
尝试初始化WideStrings
( s1
、 s2
、 s3
、 s4
,甚至可能是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.