gpt4 book ai didi

c++ - 包装第 3 方 DLL

转载 作者:可可西里 更新时间:2023-11-01 11:10:57 26 4
gpt4 key购买 nike

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

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

tpc_connect("service1")
// Do some stuff
tpc_disconnect()

我需要做的是

session1 = tpc_connect("service1")
session2 = tpc_connect("service2")
// Do some stuff with session1
// Do some stuff with session2
tpc_disconnect(session1)
tpc_disconnect(session2)

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

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

谢谢 jackson

最佳答案

我建议您放弃 COM 服务器的想法并使用原始 DLL 的拷贝。我自己使用这种方法来获取非线程安全且不支持多个实例的库的多个实例。

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

这是我做的:

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

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

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

  • 在destroy函数中,卸载DLL并删除即可。

  • 最好在临时目录中创建拷贝,以便在发生崩溃时很明显可以将其删除,尽管我不确定 Vista 中是否有限制以及以后从临时目录加载 DLL目录。

这一切都非常适合我。

关于c++ - 包装第 3 方 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/781246/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com