2

我有一个使用很多线程的应用程序。这些线程中的大多数都是由我无法控制的第三方 dll 创建的。

为了减少虚拟内存的使用,我将可执行文件的默认堆栈大小设置为 0.5MiB(而不是默认的 1MiB)。这减少了超过 500 MiB 的地址空间使用,这非常有用,因为 XP(不幸的是)有 2GiB 的虚拟内存限制。

我最近不得不将另一个第三方 dll 集成到应用程序中,这会导致此级别的堆栈溢出,因此我必须将默认堆栈大小设置回 1MiB。

DLL 正在创建一个单独的线程,这是导致问题的线程,因此我无法通过使用 CreateThread 选项在我的应用程序中使用 DLL 的线程上指定线程大小来控制它。

所以我的问题是无论如何要让 DLL 具有与可执行文件不同的内部线程的默认堆栈大小,因为我无法编辑该 Dll 的代码

4

1 回答 1

1

您可能需要使用Detours或其他 PE 挂钩代码将 DLL 的导入重定向CreateThread()到您自己的实现存根,该存根使用不同的dwStackSize参数值将蹦床导入原始导入函数。这样,您的主应用程序的线程可以使用 0.5MB,而 DLL 的线程可以使用 1.0MB。

于 2013-04-09T03:20:55.997 回答