我正在编写本机模式应用程序(请考虑:link /subsystem:native
)。这意味着我不能使用kernel32.dll中的任何内容,(显然)C运行时库中没有任何内容。通常,这对我来说不是问题,因为我需要的所有内容都在ntdll.dll中。该代码已编写并且可以正常工作。
但是,我正在用c ++编写代码,还有一个问题是如何处理异常处理。我相信本机模式应用程序的意图是使用SEH,这是我所做的。但这不是很有效。
如果我不使用/ EHa进行编译,则当我RtlRaiseException时不会调用我的析构函数。但是,如果我确实使用/ EHa进行编译,则会得到一个未定义的符号(未解析的外部符号__CxxFrameHandler4 ),该符号显然仅存在于C运行时中。
(如何)在构建本机模式应用程序的同时,如何编译我的c ++代码以支持展开?
编辑:VC有4种可能的异常处理设置,所有这些设置在这种情况下都存在问题:
-
Yes with SEH Exceptions (/EHa)
-如上所述,这会导致产生无法解析的外部符号__CxxFrameHandler4 。 -
Yes (/EHsc)
-2个未解析的符号:__CxxFrameHandler4和__std_terminate -
Yes with Extern C functions (/EHs)
-与/ EHsc相同的2个未解决 -
No
-没有未解析的符号,但是引发异常时不会调用析构函数。
我想知道是否可以链接到C运行时的非dll版本。毕竟,如果所有内容都嵌入在我的可执行文件中,则在启动时运行时不需要加载任何dll,对吧?
因此,我尝试了链接libvcruntime.lib(__ CxxFrameHandler4的明显主页)。好消息是__CxxFrameHandler4不再无法解决。坏消息是给了我另外55个未解决的符号。该列表包括__imp_TlsAlloc
和__imp_TlsGetvalue
之类的项目,这些项目显然来自kernel32.dll(因此对我来说不可用)。
我准备使用C ++异常或SEH,但是在这种情况下我都无法使用。
我看到在ntdll中导出了许多与异常相关的函数。也许我应该迷上其他异常处理机制?
Edit2 :由于__CxxFrameHandler4不适用于我,因此我尝试禁用新的异常处理(/d2FH4-
)。这样做的唯一效果是将未解析的符号更改为__CxxFrameHandler3。不是我希望的结果。
我在这里没主意。如果有某种方法可以在不使用kernel32的情况下展开堆栈,那么我找不到它。在ntdll中有名称为“ Exception”的导出函数的事实表明可能存在,但也许没有。也许总是有“ C”代码的意图,而析构函数不是问题。
如果有人有任何尝试的新事物或有新的外观的地方,我将不胜感激。甚至有权威人士称无法做到。至少那时我会知道的。