none
VerQueryValue有时成功有时失败,请问什么原因 RRS feed

  • 问题

  •  大家好,我想通过以下代码来获得某文件的产品名称(该文件路径为cs_path)

     cs_path.Replace(L"\\",L"\\\\");//把C:\123\test.exe转换为C:\\123\\test.exe
     DWORD dwSize=0;
     DWORD dwHandle=0;
     UINT uiDataSize=80;
     dwSize=GetFileVersionInfoSize(cs_path,&dwHandle);
     LPVOID lpBuffer=malloc(2*dwSize);
     if(!lpBuffer)
     {

      return ;
     }
     LPVOID lpData = malloc(2*uiDataSize);
     if(!lpData)
     {
       return ;
     }
     if(!GetFileVersionInfo(cs_path, 0, dwSize, lpBuffer))
     {
      MessageBox(L"错误1,无法完成操作",L"错误");
      return ;
     }
     CString strProduct;
     if(!(VerQueryValue(lpBuffer,
                  L"\\StringFileInfo\\040904B0\\ProductName",
         &lpData,
         &uiDataSize)))
     {
      MessageBox(L"错误2,无法完成操作",L"错误");
     }
     else
     {
      strProduct.Format(L"%s", lpData);
      MessageBox(strProduct);
     }
      free(lpBuffer);

      VerQueryValue偶尔可以成功,大多数情况下失败,请问这是为什么。谢谢了。(文件确实存在,cs_path路径也正确)使用GetLastError能有什么帮助么?和缺少语言信息定义有关?怎么样才可以获得几乎所有文件的(包括微软的几个核心文件,svchost.exe,smss.exe之类)?


    bylh
    2010年6月5日 12:40

答案

  • 1813=ERROR_RESOURCE_TYPE_NOT_FOUND

    不是每个程序都有美国英语的资源信息。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    • 已标记为答案 Nancy Shao 2010年6月10日 2:31
    2010年6月6日 1:53
    版主

全部回复

  • GetLastError的值是什么?还有,这个函数的MSDN文档里面不是有示例代码么?不是所有文件的版本信息都是美国英语的,你要枚举所有代码页。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年6月5日 13:18
    版主
  • 不管是想获得ProductName还是companyname,失败后getlastError的值都是1813,我只能获得sqlwriter等极少数文件的这些信息,包括svchost.exe,smss.exe,qq在内的几乎所有文件的信息获取都失败,请问这到底是为什么?谢谢了
    bylh
    2010年6月6日 1:36
  • 1813=ERROR_RESOURCE_TYPE_NOT_FOUND

    不是每个程序都有美国英语的资源信息。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    • 已标记为答案 Nancy Shao 2010年6月10日 2:31
    2010年6月6日 1:53
    版主
  • 可是,举个例子,我在资源管理器里面右键csrss.exe选择属性,切换到详细信息,还是看到了产品名称、文件版本等信息。那么通过其他什么手段可以得到这些信息么?谢谢了
    bylh
    2010年6月6日 7:09
  • 是不是得先判断语言种类?\StringFileInfo\\040904B0\\ProductName"中的040904B0中的数字是不是带便语种?您能否给出一个完整的代码?msdn上的例子我看不大懂。谢谢了
    bylh
    2010年6月6日 8:27
  • MSDN上的例子是枚举所有的代码页。040904B0是美国英语。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年6月6日 16:01
    版主