包装第三方DLL

Jac*_*son 1 c++ windows com atl

我有一个第三方DLL需要使用LoadLibrary()动态加载,并使用__cdecl调用约定.我需要能够使用VB6中的DLL,所以我创建了一个自己的包装器DLL,它使用__stdcall调用约定并导出所需的函数.

现在又有了额外的要求,我正在努力寻找如何管理; 包装的DLL为另一个应用程序提供API,我需要同时连接到应用程序的两个实例.这是一个问题,因为DLL没有会话的概念,典型的交互是这样的:

tpc_connect("service1")
// Do some stuff
tpc_disconnect()
Run Code Online (Sandbox Code Playgroud)

而我需要做的是

session1 = tpc_connect("service1")
session2 = tpc_connect("service2")
// Do some stuff with session1
// Do some stuff with session2
tpc_disconnect(session1)
tpc_disconnect(session2)
Run Code Online (Sandbox Code Playgroud)

我看到的主要问题是单个进程只能连接到一个服务,所以我尝试的第一个解决方案是通过使用ATL创建进程外COM服务器将DLL包装器移出到单独的进程.我现在遇到的问题是我只获得了一个COM服务器实例.

所以我的问题(最后)是否有办法强制创建一个新的ATL COM服务器实例?这是解决问题的最佳方法,还是有人想出更好的方法来解决这个问题.

谢谢杰克逊

bro*_*eld 5

我建议您转储COM服务器的想法,并使用原始DLL的副本.我自己使用这种方法来获取多个不是线程安全且不支持多个实例的库实例.

由于文件不同,Windows会将它们全部加载到单独的地址空间中,从而为它们分开.

这就是我做的:

  • 向包装器添加函数以创建和销毁库的实例.

  • 更改所有其他函数以获取指向它正在使用的库实例的指针.

  • 在create instance函数中,首先尝试使用随机文件名(即使用CreateHardLink)建立到原始DLL的硬链接.如果失败,则使用随机名称创建DLL的真实副本.如果您不想,则不需要使用DLL扩展.动态加载DLL和函数指针的副本,并返回指向内部结构的指针.

  • 在destroy函数中,只需卸载DLL并将其删除即可.

  • 最好在临时目录中创建副本,这样很明显它可以在发生崩溃时被删除,虽然我不确定Vista中是否存在限制以及稍后从temp目录加载DLL.

这一切对我来说都很完美.