2010-11-08 50 views
1

我目前正試圖將DLL(FooEmulation)集成到現有項目中。保存DLL的靜態內存的單獨實例

該DLL假定它將一次只用於模擬一個Foo,並因此使用大量靜態全局變量。
但是,我希望能夠同時管理數千個Foo實例。

我有原始DLL的源代碼,所以我可以將所有的靜態全局變量轉換爲參數(無論是直接還是通過句柄),但是DLL是單獨維護的,我希望儘可能避免分叉/合併。

我發現的一種技術是加載多個動態生成的DLL副本,但是這對於我需要的規模而言資源太大。 我也不能爲每個Foo創建一個進程或線程。

是否有可能保留DLL的靜態內存的多個副本,並在每次使用DLL時恢復它?
我如何找到它?我甚至允許觸摸它嗎?

+0

fwiw,這是在Windows上。 – mskfisher 2010-11-08 11:26:49

回答

1

當您多次將DLL加載到同一進程中時,所有靜態數據都是共享的句點。您必須重新設計庫,以便可以在運行時根據需要動態創建所有這些對象。

+0

我只想加載一次DLL--我真正想要的是當我代表'FooB'和'FooA'調用DLL函數時,換出基礎靜態數據。 – mskfisher 2010-11-08 20:13:10

+0

@mskfisher:我明白了。你必須重新設計這個庫的內部。 – sharptooth 2010-11-09 06:25:37

0

我假設你使用的是Windows,因爲沒有什麼告訴我,否則是..

看看here,這是在Windows中的DLLMain文檔。 的DLLMain有告訴你,如果

  • 的處理是否附着(加載你的DLL)
  • 一個進程分離(卸載你的DLL)
  • 一個線程附加參數(加載的每個線程的部分你的DLL)
  • 一個線程分離(卸載DLL的每個線程部分)

如果趕上進程或線程事件和分配(附加)/免費(分離)的新實例你的靜態,我認爲這會解決你的問題。這是一個有點hacky,但它會工作... 你必須小心你在DLLMain做什麼。在文檔中查找有關DLLMain中以任何方式阻止的警告。

+0

是的,這是Windows。 – mskfisher 2010-11-08 11:26:25

相關問題