C++ GetFileVersionInfo()成功,但返回的大小不正确
我正在尝试获取文件的版本。我想查看此文件的版本号,以确定在未启动的驱动器上安装了哪些操作系统(实际上,我将在Win PE环境中执行此操作,并尝试确定主驱动器是否安装了Windows XP或Windows 7)。无论如何,我有以下几点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
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++的时代和今天不推荐。每个人都会遇到:有时候,每个人都会遇到: