如何将GetProcAddress的结果强制转换为函数指针,而不在mingw上使用-fpermission



当我使用-fpermission时,我可以写这样的东西:

void (*NtSetTimerResolution)(ULONG, bool, PULONG) = 0;
int main()
{
NtSetTimerResolution = GetProcAddress(GetModuleHandle("ntdll.dll"), "NtSetTimerResolution");
ULONG pointless;
NtSetTimerResolution(0x1388, 1, &pointless);
return 0;
}

它编译和运行得很好,没有运行时错误。如何重新编写此代码以不包含fpermission?

您需要一个显式强制转换:

NtSetTimerResolution = reinterpret_cast <void (*)(ULONG, bool, PULONG)> (GetProcAddress(GetModuleHandle("ntdll.dll"), "NtSetTimerResolution"));

您可能仍然违反了严格的别名规则,但您可以使用-fno-strict-aliasing来绕过这一点。


受@Remy评论的启发,这可能会更好(DRY等等):

NtSetTimerResolution = reinterpret_cast <decltype (NtSetTimerResolution)> (GetProcAddress(GetModuleHandle("ntdll.dll"), "NtSetTimerResolution"));

我建议在初始化时使用nullptr,而不是0,如果没有其他内容的话,只是为了形式。

最新更新