在Windows 7/8.1和Windows 10中使用LocalFree/HeapFree之前,是否应该从FormatMessage查询操作系统?
From(格式化消息函数): Windows 10: LocalFree不在现代SDK中,因此无法使用 释放结果缓冲区。相反,请使用HeapFree(GetProcessHeap(), allocatedMessage)。在本例中,这与调用LocalFree相同 凭记忆 我不知道如何使用HeapFree,但我想在Windows 7、Windows 8/8.1和Windows 10中运行该应用程序,但我目前只使用LocalFree,它正在工作 这是我的代码:在Windows 7/8.1和Windows 10中使用LocalFree/HeapFree之前,是否应该从FormatMessage查询操作系统?,c,windows,winapi,C,Windows,Winapi,From(格式化消息函数): Windows 10: LocalFree不在现代SDK中,因此无法使用 释放结果缓冲区。相反,请使用HeapFree(GetProcessHeap(), allocatedMessage)。在本例中,这与调用LocalFree相同 凭记忆 我不知道如何使用HeapFree,但我想在Windows 7、Windows 8/8.1和Windows 10中运行该应用程序,但我目前只使用LocalFree,它正在工作 这是我的代码: VOID ShowErrorMsg(D
VOID ShowErrorMsg(DWORD messageId)
{
DWORD flags=FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS;
DWORD languageID = LANG_USER_DEFAULT;
LPWSTR errorMsg;
DWORD size = 0;
FormatMessageW(flags, NULL, messageId, languageID, (LPTSTR)&errorMsg, size, NULL);
wprintf(L"\n%s", errorMsg);
LocalFree(errorMsg);
}
我的问题是,在调用LocalFree
或HeapFree
之前,我是否应该使用IsWindows7SP1OrGreater
、IsWindows8Point1OrGreater
和IsWindows10OrGreater
等函数
如果我必须调用HeapFree,有人能给我举一个如何使用它的例子吗
谢谢 “现代”在这里是指WinRT/Metro/Modern/Store应用程序
LocalFree
存在于每个版本的Windows上,可供所有Windows版本的经典/桌面应用程序使用。您引用的文档提供了一个示例。只需将LocalFree(errorMsg)
替换为HeapFree(GetProcessHeap(),errorMsg)
。而且,你的打字错误了。您应该使用(LPWSTR)&errorMsg
,而不是(LPTSTR)&errorMsg
。在使用和释放errorMsg
no之前,您没有检查FormatMessageW()
的返回值是否有错误-您不需要查询操作系统版本。LocalFree
在所有操作系统版本中都存在(导出)。LocalFree不在现代SDK中
think意味着这个api没有在某些SDK中声明(奇怪的是,在14393年仍然声明)。@Checho您没有调用TCHAR
版本的FormatMessage()
,所以使用TCHAR
类型转换是错误的。您直接使用的是WCHAR
版本,因此需要WCHAR
typecast。文档是用TCHAR
编写的。@Checho我没有以任何方式对它说任何话。答案是否定的,您不需要检查操作系统版本。如果编译器的SDK能够识别LocalFree
,请使用它。否则,请改用HeapFree
。在这种情况下,它们是相同的。比较FormatMessage、LocalFree和HeapFree文档中的“需求”部分表明,如果您正在为Windows Phone构建,那么您只需要使用HeapFree而不是LocalFree。我不确定这是否是真的,但文档上是这么说的。:-)但是forLocalFree()
确实建议使用“heap函数”。如果本地函数确实有更多的开销,这将是选择堆函数的一个合理理由,但我不知道这句话是否正确。@zett42但当文档告诉您使用特定函数释放时,这将覆盖其他所有内容。您不知道Windows7是否处理LocalFree==HeapFree等。