Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi服务应用程序中的COM服务器_Delphi_Service_Com - Fatal编程技术网

Delphi服务应用程序中的COM服务器

Delphi服务应用程序中的COM服务器,delphi,service,com,Delphi,Service,Com,这是一个有点笼统的问题,但我希望有人会有具体的信息或建议 我有一个应用程序套件,其中包括一个服务应用程序,作为工业污染控制硬件的通信接口和数据历史记录。该服务包含一个单例COM服务器,允许套件的其余部分通过该服务访问硬件和数据 我读过关于SvCom是如何使COM服务器在Delphi服务应用程序中工作的。我拥有并使用SvCom——它做它声称的事情。但我对它不太满意,产品与我的编码风格和期望不匹配,这让调试更令人头疼 但我真正的问题是,SvCom让COM服务器在服务应用程序中工作的长度是绝对必要的。

这是一个有点笼统的问题,但我希望有人会有具体的信息或建议

我有一个应用程序套件,其中包括一个服务应用程序,作为工业污染控制硬件的通信接口和数据历史记录。该服务包含一个单例COM服务器,允许套件的其余部分通过该服务访问硬件和数据

我读过关于SvCom是如何使COM服务器在Delphi服务应用程序中工作的。我拥有并使用SvCom——它做它声称的事情。但我对它不太满意,产品与我的编码风格和期望不匹配,这让调试更令人头疼

但我真正的问题是,SvCom让COM服务器在服务应用程序中工作的长度是绝对必要的。他们的文档,以及在这个主题的搜索中出现的一些东西,让人觉得他们的工具箱对于服务场景中的任何COM服务器来说都是绝对必要的。但是我有两个不同的第三方库来实现OPC服务器,Prosys Sentrol和旧的生产机器人库(如果你不熟悉OPC,它是一个基于COM的非常普遍的数据交换标准)它们都支持将OPC COM服务器放入标准的基于服务的应用程序中,除了在后安装和卸载前事件中执行通常在使用/regserver或/unregserver命令行开关运行时在单机EXE中执行的操作外,无需进行特殊处理,当然还可以使用DelayInitialize:=True。因此,至少有些COM服务器可以作为典型的基于TService的应用程序,而不需要SvCom执行额外的步骤


所以我的问题是:“什么类型的COM服务器在基于TService的应用程序中工作”和“什么导致需要SvCom做的额外工作”之间的界限是否清楚?如果是,它是什么和/或记录在哪里?如果不是,我有点惊讶——似乎在服务应用程序中实现COM服务器是一个相当普遍的需求,但我做了几次深入的搜索,根据我发现的关于这个主题的信息的缺乏,可能不是。不处理UI的COM在服务中运行良好,只要记住在使用COM的每个线程中调用CoInitialize/coInitializeX。在调用
tcombojectFactory.Create
时,您可能还必须将线程模型从
tmSingle
更改为
tmpartment
。根据我的记忆(已经有一段时间了),我曾经偶然发现可以使事情正常工作,但您的想法可能会有所不同。我还记得,我必须手动将注册表值从“LocalServer32”更改为“LocalService”,以便COM在需要时启动我的服务。我不知道从那以后是否发生了很大的变化(Windows Vista和UAC的更高版本,以及从7开始的所有新的Delphi版本…),我已经使用标准的
TService
编写了服务(在BCB6中),该服务承载着COM服务器,即使在现代Windows版本中,它们也能正常工作。SvCom是一种精确性,而不是要求。让COM服务器在服务中工作并不困难。只有一些东西需要手动连接。像
LocalService
(您不更改
LocalServer32
,而是将
LocalService
添加到标准COM注册中)。关于标准COM注册,我唯一需要做的改变就是在某些情况下支持在HKCU而不是HKLM注册,但这是可选的。谢谢大家。我会查一下本地服务的资料。