1

我目前正在为 ISS Handler 将 Delphi 应用程序转换为 C#。Delphi 使用这些内存类(TMemoryStream、TStreamAdapter)传递给方法、插入字符串值以及从内存中返回和检索值。我的问题是,我是否真的需要创建内存对象来插入字符串值并将它们传递给检索方法,或者这只是 Delphi 处理程序独有的。目前我只是在我的 ISS 处理程序中传递和检索字符串值,这将是一种正确的转换。我研究过,结果很短。非常感谢您的帮助。

例如德尔福代码:

    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包装 aTStream并呈现IStream接口的类。为了使用它,必须提供一个具体的流。因此使用TMemoryStream. 显然CAGetPath必须在某处返回 URL,为什么不返回内存流?

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

我认为您已经全神贯注于复制 Delphi 实现。在你的鞋子里,我只是试图了解基本要求是什么。您的 IIS 处理程序需要做什么?然后使用惯用的 C# 技术和类来实现它。使用现存的 Delphi 代码作为需求的指南,而不是作为如何实现该需求的指南。

于 2013-05-22T08:57:17.397 回答