我的D5应用程序位于几个用户远程使用的服务器上,因此我需要使用以下函数创建一个COM对象,以便在启动时启动安装在该用户PC上的另一个应用程序(LmPos):
CreateRemoteComObject(const MachineName: WideString; const ClassID: TGUID): IUnknown;
而不是像以前一样创建本地COM对象:
EposServer := CreateOLEObject('POS.Server');
但是,要连接的MachineName和ClassID将取决于启动此应用程序的用户。我发现这有两个问题...
参数必须是常量,那么如何为它们分配变量?或者这是不可能的,因为它们是常数。
如果我要求用户输入,如何将String转换为TGUID?它似乎只接受格式:='{xxxx-xxxx-xxxx etc}'
非常感谢任何帮助。我现在还不确定这是否可行,我正在尝试配置DCOM但没有成功。
答案 0 :(得分:2)
AFAIK服务器上的DCOM远程应用程序将始终在记录当前用户的情况下运行。
如果可以的话,摆脱DCOM。这是一种弃用的技术,Windows 7和2008 Server不喜欢它。您需要在PC上强制使用SMB 1协议,即便如此,我们也遇到了很多问题。
我最近遇到了一些与Delphi 5应用程序池类似的问题。我将现有Delphi 5应用程序的DCOM调用转换为HTTP服务,使用在Windows服务中运行的http.sys kernel-mode server(在服务器启动时启动,甚至在任何用户登录之前),以及WinHTTP用于客户端,它模仿了最初的DCOM类(所以客户端只改变了一个单元)。由于HTTP是无状态的,为了将事件从服务器推送到客户端,我在客户端类中添加了一个基于计时器的查询,以从服务器检索任何未决事件(500毫秒的时间足够且高效)。这个解决方案就像Delphi 5现有代码的魅力一样,最终客户就像速度和稳定性一样。