我有一个使用很多线程的应用程序。这些线程大多数是由我无法控制的第三方dll创建的。
为了减少虚拟内存的使用,我将可执行文件的默认堆栈大小设置为0.5MiB(而不是默认的1MiB)。这样可以减少500 MiB以上的地址空间使用量,这非常有用,因为XP(不幸的是)的虚拟内存限制为2GiB。
我最近不得不将另一个第三方dll集成到应用程序中,这会导致此级别的堆栈溢出,因此我必须将默认堆栈大小设置回1MiB。
DLL正在创建一个单独的线程,导致该问题,所以我无法通过使用CreateThread选项在应用程序中使用DLL的线程上指定线程大小来控制它。
所以我的问题是,如果我无法编辑该DLL的代码,是否仍然需要使DLL的内部线程的默认堆栈大小与可执行文件的默认堆栈大小不同
最佳答案
您可能需要使用Detours或其他PE Hook 代码来将DLL的CreateThread()
导入重定向到自己的实现 stub ,该实现 stub 使用不同的dwStackSize
参数值将蹦床导入原始导入的函数中。这样,您的主应用程序的线程可以使用0.5MB,而DLL的线程可以使用1.0MB。