簡體   English   中英

包裝第三方DLL

[英]Wrapping a 3rd party DLL

我有一個第三方DLL,需要使用LoadLibrary()動態加載它並使用__cdecl調用約定。 我需要能夠使用VB6中的dll,因此我創建了自己的包裝DLL,該包裝DLL使用__stdcall調用約定並導出了所需的功能。

另一個要求現在已經到來,我正在努力查看如何進行管理。 包裝的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創建進程外COM服務器,將DLL包裝器移到單獨的進程中。 我現在遇到的問題是,我只得到一個COM服務器實例。

所以我的問題(最后)是否有辦法強制創建ATL COM服務器的新實例? 這是解決問題的最佳方法,還是有人可以想到解決此問題的更好方法。

謝謝傑克遜

我建議您轉儲COM服務器的想法,並保留原始DLL的副本。 我本人已使用這種方法來獲得多個不是線程安全的並且不支持多個實例的庫實例。

由於文件不同,Windows會將它們全部加載到單獨的地址空間中,從而使它們分開。

這是我所做的:

  • 將函數添加到包裝器以創建和銷毀該庫的實例。

  • 更改所有其他函數以獲取指向它正在使用的庫實例的指針。

  • 在創建實例函數中,首先嘗試使用隨機文件名(即,使用CreateHardLink )建立到原始DLL的硬鏈接。 如果失敗,則使用隨機名稱制作DLL的真實副本。 如果不想,則不需要使用DLL擴展名。 動態加載該DLL和函數指針的副本,並返回指向您內部結構的指針。

  • 在destroy函數中,只需卸載DLL並將其刪除。

  • 最好在臨時目錄中創建副本,以便很明顯可以在崩潰時將其刪除,盡管我不確定Vista中是否存在限制,以及以后從臨時目錄加載DLL的限制。

這一切對我來說都很完美。

如果您只需要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

這可能會起作用,具體取決於其他應用程序的細節。 反正值得一試。

-唐

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM