2011-03-04 69 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