Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Windows 7/8.1和Windows 10中使用LocalFree/HeapFree之前,是否应该从FormatMessage查询操作系统?_C_Windows_Winapi - Fatal编程技术网

在Windows 7/8.1和Windows 10中使用LocalFree/HeapFree之前,是否应该从FormatMessage查询操作系统?

在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

From(格式化消息函数):

Windows 10:

LocalFree不在现代SDK中,因此无法使用 释放结果缓冲区。相反,请使用HeapFree(GetProcessHeap(), allocatedMessage)。在本例中,这与调用LocalFree相同 凭记忆

我不知道如何使用HeapFree,但我想在Windows 7、Windows 8/8.1和Windows 10中运行该应用程序,但我目前只使用LocalFree,它正在工作

这是我的代码:

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。我不确定这是否是真的,但文档上是这么说的。:-)但是for
LocalFree()
确实建议使用“heap函数”。如果本地函数确实有更多的开销,这将是选择堆函数的一个合理理由,但我不知道这句话是否正确。@zett42但当文档告诉您使用特定函数释放时,这将覆盖其他所有内容。您不知道Windows7是否处理LocalFree==HeapFree等。