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

问题描述:

我需要使用使用.NET框架创建的DLL。此DLL使COM可见。在delphi中使用COM DLL - MSVCR80D.dll错误中的访问冲突

我想用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; 
    begin 
        Result := DefaultInterface.Process(meterBSN, NICSerial, partNumber, otherConfig, returnMessage); 
    end; 
    
  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; 

但是当处理的方法叫我获得以下错误。 alt text http://i41.tinypic.com/2daf1ix.png

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

尝试初始化WideStringss1s2s3s4,甚至可能o)。如果我没有记错,那么在设置它们之前,它们在Delphi中是动态的,零(000000000)。

+0

你摇滚MarkusQ!非常感谢。 如果可以的话,我会给你100票。 :) – Hemant 2009-02-25 06:56:26

+0

干得好!这也是我看到它时发现的。 @Hermant:为了将来的使用,请记住局部变量(在方法体中声明)大部分(字符串除外)未初始化,并且可以包含任何内容。全局声明或作为类的成员字段声明的变量被设置为默认值。 – 2009-02-25 12:02:06

除了MarkusQ说的什么之外,请注意你对TValidationRequest对象的内存管理不太好。使用Create(nil)然后在finally - 块写入FreeAndNil(valReq)会更清洁。现在,您每次单击按钮时都会创建一个对象,并且它们都将保留在内存中,直到您销毁表单。至少你不会得到内存泄漏,因为你将Self传递给了构造函数,所以至少这个表单会负责销毁这些对象。在你的例子中,在TForm1.buttonClick方法结束后,确实不需要保持对象存在。