4

.NET フレームワークを使用して作成された DLL を使用する必要があります。この DLL は、COM から見えるようになります。

Delphi 2006 を使用して作成されたアプリケーションでこの DLL を使用したいと考えています。次の手順に従いました。

  1. regscr32 を使用して DLL を登録しました。
  2. Delphi IDE を使用してタイプ ライブラリをインポートしました。_TLB.pas ファイルを作成しました。次の署名が TLB ファイルに作成されました。

    function TValidationRequest.Process(var meterBSN: WideString; var NICSerial: WideString;
                                        var partNumber: ワイドストリング; var otherConfig: ワイドストリング;
                                        out returnMessage: WideString): Smallint;
    始める
      結果:= DefaultInterface.Process(meterBSN、NICSerial、partNumber、otherConfig、returnMessage);
    終わり;
    
  3. 次のコード スニペットを使用してメソッドを呼び出そうとしました。

手順 TForm1.buttonClick(送信者: TObject);
変数
  valReq: TValidationRequest;
  s1、s2、s3、s4、s5: ワイド文字列。
  o: ワイド文字列;
始める
  valReq := TValidationRequest.Create (自己);
  試す
    valReq.Process (s1、s2、s3、s4、o);
    MessageDlg(o, mtInformation, [mbOK], 0);
  最後に
    valReq := ゼロ;
  終わり;
終わり;

しかし、 Process メソッドが呼び出されると、次のエラーが発生します。 代替テキスト

解決策を提案してください。

4

2 に答える 2

7

WideStrings( s1s2s3s4そしておそらく) を初期化してみてくださいo。私の記憶が正しければ、Delphi では動的であり、設定する前は nil (000000000) です。

于 2009-02-25T06:46:30.770 に答える
2

MarkusQ が言ったことに加えて、TValidationRequestオブジェクトのメモリ管理があまり良くないことに注意してください。Create(nil)使用してからfinally-block writeの方がクリーンFreeAndNil(valReq)です。現在の方法ではTValidationRequest、ボタンをクリックするたびに 1 つのオブジェクトを作成し、フォームを破棄するまですべてのオブジェクトがメモリに残ります。Selfコンストラクターに渡したので、少なくともフォームがそれらのオブジェクトの破棄を処理するため、少なくともメモリ リークは発生しません。TForm1.buttonClickあなたの例では、メソッドが終了した後もオブジェクトを存続させる必要はありません。

于 2009-02-25T20:03:11.793 に答える