4

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

我想在使用 Delphi 2006 创建的应用程序中使用这个 DLL。我遵循了以下步骤:

  1. 使用 regscr32 注册 DLL。
  2. 使用 Delphi 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);
    结尾;
    
  3. 我尝试使用以下代码片段调用该方法。

过程 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 方法时出现以下错误。 替代文字

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

4

2 回答 2

7

尝试初始化WideStrings( s1, s2, s3, s4, 甚至o)。如果我没记错的话,在您设置它们之前,它们在 Delphi 和 nil (000000000) 中是动态的。

于 2009-02-25T06:46:30.770 回答
2

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

于 2009-02-25T20:03:11.793 回答