Closed catsxp closed 5 years ago
VC-LTL根本就没有__acrt_initialize_heap,而是直接使用直接使用msvcrt的heap....加群具体说下吧,可能链接有些问题。
并不是断在 LTL里的,这问题一个月以前就发现了 只是一直拖着自己在尝试源码修正,但效果极差!放弃了!
HANDLE __acrt_heap = nullptr;
bool __acrt_initialize_heap() {
__acrt_heap = ::HeapCreate(0, 0, 0);
return true;
}
bool __acrt_uninitialize_heap() {
::HeapDestroy(__acrt_heap);
__acrt_heap = nullptr;
return true;
}
intptr_t _get_heap_handle(void) {
return reinterpret_cast<intptr_t>(__acrt_heap);
}
试试找到相关代码注释掉,不好用不要钱
int main()
{
CPINFOEXA ci;
printf("%08X", _get_heap_handle());
system("pause");
}
clang-cl+ltl编译运行结果 C:\Users\xspee\source\repos\ConsoleApplication1\ConsoleApplication1>clang-cl ConsoleApplication1.cpp ConsoleApplication1.cpp(12,17): warning: format specifies type 'unsigned int' but the argument has type 'intptr_t' (aka 'long long') [-Wformat] printf("%08X", _get_heap_handle());
%08llX
1 warning generated.
C:\Users\xspee\source\repos\ConsoleApplication1\ConsoleApplication1>ConsoleApplication1.exe
0C2D0000请按任意键继续. . .
HANDLE __acrt_heap = nullptr; bool __acrt_initialize_heap() { __acrt_heap = ::HeapCreate(0, 0, 0); return true; } bool __acrt_uninitialize_heap() { ::HeapDestroy(__acrt_heap); __acrt_heap = nullptr; return true; } intptr_t _get_heap_handle(void) { return reinterpret_cast<intptr_t>(__acrt_heap); }
试试找到相关代码注释掉,不好用不要钱
感谢!思维受限制了,一直在尝试修正,猜测是引用不明引起的。 试一试!先谢过了!
HANDLE __acrt_heap = nullptr; bool __acrt_initialize_heap() { __acrt_heap = ::HeapCreate(0, 0, 0); return true; } bool __acrt_uninitialize_heap() { ::HeapDestroy(__acrt_heap); __acrt_heap = nullptr; return true; } intptr_t _get_heap_handle(void) { return reinterpret_cast<intptr_t>(__acrt_heap); }
试试找到相关代码注释掉,不好用不要钱
感谢!思维受限制了,一直在尝试修正,猜测是引用不明引起的。 试一试!先谢过了!
测试过了,前来报到 我这边的文件是allocator_shim_override_ucrt_symbols_win.h 不知道你是什么项目
哦,你说的是这个问题啊,,,,很久以前我们发现并且找到了解决方案,在QT里。 VC-LTL已经直接导出了,_get_heap_handle,外部无需在实现一份。这个源代码我也感到很奇怪,微软不是提供了crt api获取,为什么他还要自己创建一个堆。问题引发根源是VC-LTL直接使用的是msvcrt.dll的堆,所以__acrt_initialize_heap根本就不会去调用。所以把这边实现的_get_heap_handle注释掉,直接调用msvcrt导出的就可以啦。
如题 LLVM 下对于函数 _get_heap_handle __acrt_heap 获取总为 nullptr 源码跟进,断点 acrt_initialize_heap ,貌似并没有去 acrt_initialize_heap 创建 而直接 _get_heap_handle。 改了 _get_heap_handle,让它 先去 __acrt_initialize_heap ,治标不治本其它地方还是暴0xc00005 在不使用 LTL 编译正常 起初以为是mode的原因,但改成 new_mode 问题似旧!