Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.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
C++ GetFileVersionInfo()成功,但返回的大小不正确_C++_Winapi - Fatal编程技术网

C++ GetFileVersionInfo()成功,但返回的大小不正确

C++ GetFileVersionInfo()成功,但返回的大小不正确,c++,winapi,C++,Winapi,我正在尝试获取文件的版本。我想查看此文件的版本号,以确定在未启动的驱动器上安装了哪些操作系统(实际上,我将在Win PE环境中执行此操作,并尝试确定主驱动器是否安装了Windows XP或Windows 7)。无论如何,我有以下几点 wchar_t *fileName; fileName = new wchar_t[255]; lstrcpy(fileName, hdds[HardDriveIndexes::SystemDrive].driveLetter.c_str()); lstrcat

我正在尝试获取文件的版本。我想查看此文件的版本号,以确定在未启动的驱动器上安装了哪些操作系统(实际上,我将在Win PE环境中执行此操作,并尝试确定主驱动器是否安装了Windows XP或Windows 7)。无论如何,我有以下几点

wchar_t *fileName;
fileName = new wchar_t[255];

lstrcpy(fileName, hdds[HardDriveIndexes::SystemDrive].driveLetter.c_str());

lstrcat(fileName, L"Windows\\System32\\winload.exe");

TCHAR *versionInfoBuffer;

DWORD versionDataSize;

if (versionDataSize = GetFileVersionInfoSize(fileName, NULL) != 0)
{
    versionInfoBuffer = new TCHAR[versionDataSize];

    BOOL versionInfoResult = FALSE;

    versionInfoResult = GetFileVersionInfo(fileName, NULL, versionDataSize, versionInfoBuffer);
    if (versionInfoResult == FALSE)
    {
        wprintf(L"The last error associated with getting version info is: %d\n", GetLastError());
    }

}
else
{
    wprintf(L"The last error associated with gettting version info size is: %d\n", GetLastError());
}
问题是GetFileVersionInfo()成功,但始终返回1作为大小。这会导致GetFileVersionInfo()失败,出现错误122。到目前为止,我只在Windows7系统上进行了测试。还有另一个函数GetFileVersionInfoSizeEx()可以正常工作,但它仅在Vista以后才受支持。如果可能的话,我想保留XP支持(我们的一些旧Win PE映像仍然基于XP)


GetFileVersionInfoSize()是否已被弃用,而我不知何故找不到该信息,是否使用不当,等等?

问题不在于调用,而在于您的分配;你需要帕伦斯的帮助:

if ( ( versionDataSize = GetFileVersionInfoSize(fileName, NULL) ) != 0)

您编写的内容指定表达式
size!=0
,表示为真。

问题不在于通话,而在于你的作业;你需要帕伦斯的帮助:

if ( ( versionDataSize = GetFileVersionInfoSize(fileName, NULL) ) != 0)

您编写的内容指定表达式
size!=0
,1表示真。

当您可以声明一个wchar\t数组时,为什么在这里分配<代码>wchar_t*文件名;fileName=new wchar_t[255]您无缘无故引入了潜在的内存泄漏。您还有另一个
versionBufferInfo
的潜在泄漏。也许您应该阅读以下内容:就您的错误而言,我使用
GetFileVersionInfoSize
并将DWORD变量的地址作为第二个参数,而不是NULL。即使在Windows 2K中,它也对我有效。堆上的动态内存分配与堆栈上的静态内存分配。。。只要我小心内存泄漏,这不是唯一真正的区别吗?还是有一些我一直缺少的一般准则?我已经编程C++大约5年了,但并不认为它非常重要,它几乎是一个偏好问题。而且,PaulMcKeZii我也尝试过这样做,并且DWORD只需要0的值。在基于NT的操作系统中似乎没有使用它,
是否有一些我一直缺少的一般准则?
1)如果编写的代码可能引发异常,那么对
delete
的调用以后永远不会执行,会发生什么?阅读
RAII
及其功能。或者很简单,您只是忘记调用
delete
。2) 至于“偏好问题”,分配具有常量值的数组的代码表明(无论是否公平),程序员没有经验。很简单,以您已经完成的样式编写代码或多或少是过时的。是的,它是有效的,但在C++的时代和今天不推荐。为什么你在这里分配,当你刚刚声明了一个WaCHARTT数组?代码>wchar_t*文件名;fileName=new wchar_t[255]您无缘无故引入了潜在的内存泄漏。您还有另一个
versionBufferInfo
的潜在泄漏。也许您应该阅读以下内容:就您的错误而言,我使用
GetFileVersionInfoSize
并将DWORD变量的地址作为第二个参数,而不是NULL。即使在Windows 2K中,它也对我有效。堆上的动态内存分配与堆栈上的静态内存分配。。。只要我小心内存泄漏,这不是唯一真正的区别吗?还是有一些我一直缺少的一般准则?我已经编程C++大约5年了,但并不认为它非常重要,它几乎是一个偏好问题。而且,PaulMcKeZii我也尝试过这样做,并且DWORD只需要0的值。在基于NT的操作系统中似乎没有使用它,
是否有一些我一直缺少的一般准则?
1)如果编写的代码可能引发异常,那么对
delete
的调用以后永远不会执行,会发生什么?阅读
RAII
及其功能。或者很简单,您只是忘记调用
delete
。2) 至于“偏好问题”,分配具有常量值的数组的代码表明(无论是否公平),程序员没有经验。很简单,以您已经完成的样式编写代码或多或少是过时的。是的,它是有效的,但在C++的时代和今天不推荐。每个人都会遇到:有时候,每个人都会遇到: