IIS处理程序,Delphi到c#的转换

本文关键字:转换 Delphi 处理 程序 IIS | 更新日期: 2023-09-27 18:14:51

我目前正在为ISS处理程序将Delphi应用程序转换为c#。Delphi使用这些内存类(TMemoryStream, TStreamAdapter)来传递方法,插入字符串值,以及从内存中返回和检索值。我的问题是,我是否真的需要创建内存对象来插入字符串值并通过方法传递它们进行检索,或者这只是Delphi处理程序所独有的。目前我只是传递和检索字符串值在我的ISS处理程序,这将是一种正确的转换。我研究了一下,但没有找到答案。感谢您的帮助。

for example Delphi code:

    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。这有必要吗?为什么会有人这样做?

IIS处理程序,Delphi到c#的转换

我真的需要创建内存对象来插入字符串值并通过方法传递它们以进行检索吗,或者这只是Delphi处理程序所独有的吗?

Delphi代码的作者最适合解释为什么以这种特殊的方式完成。然而,在我看来,CAGetPath是一个外部函数,因为它是用stdcall声明的。因此,作者需要提出一种可靠的方法来跨模块边界编组文本数据。作者选择使用COM ISequentialStream接口,这是一个非常合理的选择。

为了与Delphi中的控件交互,作者需要使用一个实现ISequentialStream的对象。最简单的方法是使用TStreamAdapter类,它包装TStream并呈现IStream接口。为了使用它,必须提供混凝土流。因此使用TMemoryStream。显然CAGetPath必须返回URL某处,为什么不是内存流?

无论如何,这是我对为什么Delphi代码是这样的最好猜测。没有证据表明需要内存流来实现IIS处理程序(不管是什么)。

我认为你对复制Delphi的实现都很着迷。站在你的立场上,我只会试图理解潜在的需求是什么。IIS处理程序需要做什么?然后使用惯用的c#技术和类来实现它。使用现有的Delphi代码作为需求是什么的指南,但不作为如何实现该需求的指南。