在 delphi 中使用 COM DLL - MSVCR80D.dll 错误中的访问冲突

Posted

技术标签:

【中文标题】在 delphi 中使用 COM DLL - MSVCR80D.dll 错误中的访问冲突【英文标题】:Using a COM DLL in delphi - Access violation in MSVCR80D.dll error 【发布时间】:2010-10-09 18:08:49 【问题描述】:

我需要使用使用 .NET 框架创建的 DLL。该 DLL 使 COM 可见。

我想在使用 Delphi 2006 创建的应用程序中使用此 DLL。我已按照以下步骤操作:

    使用 regscr32 注册了 DLL。

    使用导入类型库 德尔福IDE。它创造了 _TLB.pas 文件。在 TLB 文件中创建了以下签名。

    函数 TValidationRequest.Process(var meterBSN: WideString; var NICSerial: WideString; var partNumber: WideString; var otherConfig: WideString; 出 returnMessage: WideString): Smallint; 开始 结果 := DefaultInterface.Process(meterBSN, NICSerial, partNumber, otherConfig, returnMessage); 结尾;

    我尝试使用以下方法调用该方法 以下代码sn-p。

过程 TForm1.buttonClick(Sender: TObject); 变量 valReq:TValidationRequest; s1、s2、s3、s4、s5:宽字符串; o:宽弦; 开始 valReq := TValidationRequest.Create (Self); 尝试 valReq.Process (s1, s2, s3, s4, o); MessageDlg(o, mtInformation, [mbOK], 0); 最后 valReq := 无; 结尾; 结尾;

但是当调用 Process 方法时出现以下错误。

你能提出任何解决方案吗?

【问题讨论】:

【参考方案1】:

尝试初始化WideStringss1,s2,s3,s4,甚至可能是o)。如果我没记错的话,在您设置它们之前,它们在 Delphi 中是动态的并且为零 (000000000)。

【讨论】:

你摇滚 MarkusQ!非常感谢。如果可以的话,我会给你 100 票。 :) 干得好!这也是我看的时候发现的。 @Hermant:为了将来的使用,请记住本地变量(在方法主体中声明)大部分(字符串除外)未初始化并且可以包含任何内容。全局声明或作为类的成员字段声明的变量设置为默认值。【参考方案2】:

除了 MarkusQ 所说的,请注意您对 TValidationRequest 对象的内存管理不是那么好。使用Create(nil) 然后在finally-block 中写入FreeAndNil(valReq) 会更干净。现在的方式是,每次单击按钮时都会创建一个 TValidationRequest 对象,它们都将保留在内存中,直到您销毁表单。至少您不会因为您将Self 传递给构造函数而导致内存泄漏,因此至少表单将负责销毁这些对象。在您的示例中,在 TForm1.buttonClick 方法结束后,确实不需要让对象保持活动状态。

【讨论】:

完全同意你的观点。实际上我创建了代码 sn-p 以便更好地理解这个问题。它不是我的生产代码的一部分 :) 感谢您指出!

以上是关于在 delphi 中使用 COM DLL - MSVCR80D.dll 错误中的访问冲突的主要内容,如果未能解决你的问题,请参考以下文章

在没有类型库的情况下使用来自 C# 的 COM dll

delphi编写与调用DLL(delphi7下测试通过)

使用Delphi创建的DLL在其他Delphi版本中运行良好,应该遵循哪些原则?

Delphi在创建和使用DLL的时候如果使用到string,请引入ShareMem单元

深入Delphi下的DLL编程

如何在Delphi中使用用C#创建的DLL