包装第三方DLL

问题描述:

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

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

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) 

主要问题,我发现一个进程只能被绑定到一个服务,所以我尝试的第一个解决方案是通过使用ATL创建一个Out-Of-Process COM服务器来将DLL包装移出到单独的进程。我现在遇到的问题是我只能得到一个COM服务器的单个实例。

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

感谢杰克逊

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

由于文件不同,Windows会将它们全部加载到单独的地址空间中,从而使它们保持分离状态。

这是我做过什么:

  • 添加功能,包装上,以创建和销毁该库的实例。

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

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

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

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

这一切都适合我。

+0

完成实现包装 - 我尝试使用CreateHardLink而不是一个副本,但它没有为我工作,所以最后与完整的副本的DLL。 – Jackson 2009-04-24 15:41:54

如果你只需要2节您可以使原始的dll文件的副本,并将其命名为别的东西。他们在你的包装DLL导出两个单独的调用(每个DLL一个)。 所以你必须:

session1 = tcp_connect("whatever")  'this points to dll1.dll 
session2 = tcp_connect2("whatever")  'this points to a copy of dll1 called dll2.dll 

这可能取决于其他应用的具体工作。无论如何都值得一试。

-don