2011-03-04 35 views
3

我有一個使用靜態線程本地存儲(__declspec(thread))的DLL(用C語言編寫),我想從Visual Basic圖形界面使用此DLL。使用變量聲明崩潰__declspec(線程)

不幸的是,當在Windows XP上運行接口時,使用靜態線程本地存儲的DLL在嘗試訪問其線程變量時崩潰。

我該如何解決這個問題?

感謝, 問候

G.B.

PS 我想不修改DLL。

+0

請向我們展示您使用的VB代碼。 – 2011-03-04 13:53:32

+1

這是偶然的事情,如從舊的新事物[使用變量的後果聲明__declspec(線程)](http://blogs.msdn.com/b/oldnewthing/archive/2010/11/22/10094489.aspx) ? – 2011-03-04 13:54:17

+0

@MichaelKjörling是的,我在那裏發現了一個類似的問題,但是它解決了c#應用程序。 – Beppe 2011-03-04 14:30:08

回答

5

這是靜態TLS的known limitation。儘管您沒有明確地調用LoadLibrary(),但VB運行時仍以您的名義進行操作。

請注意,此限制已從Vista中解除。我所知道的最全面的參考文獻是Ken Johnson的blog

如果你能得到包含在生成的.exe的進口表中的DLL,這可能涉及一些PE黑客攻擊,而且我很不確定這是一個可行的策略,你也許能夠解決這個問題。否則,你需要改變DLL。

+0

嗨大衛,謝謝你的回覆,在你發佈的文章中,它說錯誤只發生在DLL動態加載時,所以如果我以靜態方式加載DLL,問題應該被修復。怎麼做?謝謝 – Beppe 2011-03-04 14:18:21

+1

@Beppe我甚至不確定你可以安排DLL隱式加載VB6。我認爲你唯一的希望就是修改你的.exe的導入表來包含對你的DLL的引用。隱式TLS的早期實現的假設是DLL隱式加載。 – 2011-03-04 14:23:42

+0

我正在嘗試訪問肯塔基約翰遜的TLS上的幾個地方提到的博客,但鏈接似乎並不工作。任何想法,如果它被取下或移動? Way Back Machine或其他地方有備份嗎? – 2016-02-21 06:07:22