我目前正在将一个Delphi应用程序转换为C#for ISS Handler.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。就像我能说的那样。这是必要的,为什么有人会这样做?
答案 0 :(得分:1)
我是否真的需要创建内存对象来插入字符串值并将它们传递给检索方法,或者这只是Delphi处理程序所特有的?
Delphi代码的作者最适合解释为什么以特定的方式完成。但是,它看起来好像CAGetPath
是一个外部函数,因为它是使用stdcall
声明的。因此,作者需要提出一种可靠的方法来跨模块边界编组文本数据。作者选择使用COM ISequentialStream
接口,这是一个非常合理的选择。
为了与Delphi中的交互,作者需要使用实现ISequentialStream
的对象。最简单的方法是使用包含TStreamAdapter
的{{1}}类并提供TStream
接口。为了使用它,必须提供具体的流。因此使用IStream
。显然TMemoryStream
必须在某处返回URL,为什么不返回内存流?
无论如何,这是我最好的猜测,为什么Delphi代码就是这样。没有证据表明需要内存流来实现IIS处理程序(无论它们是什么)。
我认为你们正忙着复制Delphi的实现。在你的鞋子里,我只想了解潜在的要求是什么。您的IIS处理程序需要做什么?然后使用惯用的C#技术和类来实现它。使用现有的Delphi代码作为 要求的指南,但不作为如何实现该要求的指南。