2010-09-06 29 views
0

我真的需要帮助......如何加载DLL作为本地服务器

我实现了一个COM组件(即A.DLL)与IDL,还编写了一个包装DLL(B.DLL)为零件。我已经实现了DLL“A”所需的导出函数,并将其注册为“regsvr32.exe”。

问题是我有3个EXE文件使用B.dll来访问A.dll的方法。但是,我无法设法为A.dll创建本地服务器,因此每个EXE都会加载一个新的A.dll和B.dll。我只想加载A.dll一次,并需要在B.dll中实现此功能。最后的声明也开放供讨论。

但是,我无法找到任何有关此问题的有用示例或资源。任何帮助将不胜感激,在此先感谢。

+0

你为什么反对让这些库加载好几次? – sharptooth 2010-09-06 07:03:45

+0

@sharptooth因为,A.dll打开一个数据库文件作为资源,并且多次打开此文件会导致问题。 – 2010-09-06 07:07:34

+0

我明白了。我想更好的解决方案是使用NT服务来处理数据库。这样你就不必关心同时拥有多少个COM服务器副本 - 他们会通过说RPC来与服务对话,并且该服务将在内部同步对数据库的访问。 – sharptooth 2010-09-06 07:28:38

回答

1

由COM介导的DLL被称为进程内服务器。这就暗示了你的问题:它总是被映射到客户端的内存空间,就像任何其他DLL一样。同样,任何DLL负载都将映射到原始进程中。目前尚不清楚你的问题为什么你不想使用DLL。如果是为了节省资源,那么就要考虑只有数据会被复制;该代码将只加载一次。如果这是因为您希望他们共享数据,那么请考虑使用共享内存。如果你真的希望所有三个.exe都由一个实例提供服务,那么你需要的是一个COM本地服务器,它将通过.exe而不是.dll实现。

+0

或者使用DLL的代理可执行文件:https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms686606(v=vs.85).aspx – vines 2018-02-16 11:19:24

1

没有“创建本地服务器”这样的事情。进程内服务器必须加载到每个消费者进程中,这是没有办法的 - 每个消费者都是一个独立的进程,所以它有自己的代码和数据副本。

为了让一个进程为所有消费者执行COM服务器代码,您必须创建一个out-proc服务器。要做后者,您可以重新构建COM服务器或尝试使用COM +服务器应用程序。通过这种方式,您可以有一个单独的进程运行多个使用者可以连接的COM服务器代码。

+0

不明白你为什么得票低。答案很好。 – Timores 2010-09-06 09:51:14

相关问题