在 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。
但是当调用 Process 方法时出现以下错误。
你能提出任何解决方案吗?
【问题讨论】:
【参考方案1】:尝试初始化WideStrings
(s1
,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 错误中的访问冲突的主要内容,如果未能解决你的问题,请参考以下文章
使用Delphi创建的DLL在其他Delphi版本中运行良好,应该遵循哪些原则?