1

私は現在、Delphi アプリケーションを ISS Handler 用の C# に変換しています。Delphi は、これらのメモリ クラス (TMemoryStream、TStreamAdapter) を使用して、メソッドに渡し、文字列値を挿入し、メモリから値を返したり取得したりします。ここでの質問は、メモリ オブジェクトを作成して文字列値を挿入し、メソッドを介して取得する必要があるのか​​、それとも Delphi ハンドラに固有のものなのかということです。現在、ISS ハンドラーで文字列値を渡したり取得したりしていますが、これは一種の正しい変換になります。私は調査し、不足しました。どうぞよろしくお願いいたします。

たとえば、Delphi コードの場合:

    m := TMemoryStream.Create;
    iss := TStreamAdapter.Create(m, soOwned);
    iss._AddRef;

    try
      hr := CAGetPath(cas, cam, cal, iss);
      cb := 0;
       m.Write(cb, sizeof(WideChar));
       s := PWideChar(m.Memory);
    finally
      iss._Release;
    end;

    function CAGetPath(SubscriberID, MailshotID, LinkID: integer;
      stmPath: ISequentialStream): HRESULT; stdcall;
    {
        sPath: WideString;
        sPath := "\\MYPATH\\TO\\FOLDER"
        stmPath._AddRef;
        cb := length(sPath) * sizeof(WideChar);
        ES := 'stmPath.Write(' + sPath + ')';
        Result := stmPath.Write(PWideChar(sPath), cb, nil);

    }

この Delphi コードのビットは、文字列を返し、それを変数 s に設定するだけです。私が知る限り。これは必要であり、なぜ誰かがこのようにするのでしょうか?

4

1 に答える 1

1

文字列値を挿入し、メソッドを介してそれらを取得するためにメモリ オブジェクトを作成する必要がありますか?それとも、これは Delphi ハンドラに固有のものですか?

Delphi コードの作成者は、その特定の方法で行われた理由を説明するのに最適です。CAGetPathただし、を使用して宣言されているため、外部関数のように見えますstdcall。したがって、作成者は、モジュールの境界を越えてテキスト データをマーシャリングする確実な手段を考え出す必要がありました。著者は、完全に妥当な選択である COMISequentialStreamインターフェイスを使用することを選択しました。

Delphi からそれと対話するために、作成者は を実装するオブジェクトを使用する必要がありましたISequentialStream。最も簡単な方法は、TStreamAdapterをラップしてインターフェースTStreamを提示するクラスを使用することです。IStreamこれを使用するには、具体的なストリームを提供する必要があります。したがって、の使用TMemoryStream。明らかCAGetPathに URL をどこかに返す必要がありますが、なぜメモリ ストリームではないのでしょうか?

とにかく、それが Delphi コードがそのようになっている理由についての私の最善の推測です。IIS ハンドラー (それが何であれ) を実装するためにメモリ ストリームが必要であるという証拠はありません。

Delphi 実装の複製に夢中になっていると思います。あなたの立場で言えば、私は基本的な要件が何であるかを理解しようとするだけです。IIS ハンドラーは何をする必要がありますか? 次に、慣用的な C# の手法とクラスを使用してそれを実装します。現存する Delphi コードを要件のガイドとして使用してくださいただし、その要件を実装する方法のガイドとしては使用しないでください。

于 2013-05-22T08:57:17.397 に答える