如题

解决方案 »

  1.   

    这个要看资源本身有没有metadata,有的话读出来,没有就没办法啊
      

  2.   


    BOOL CProcSpyApp::GetFileVersion(LPCTSTR lpszFileName, short *VerInfo)
    {
    VerInfo[0]=0;
    VerInfo[1]=0;
    VerInfo[2]=0;
    VerInfo[3]=0;

    DWORD dwInfoSize = GetFileVersionInfoSize((LPSTR)lpszFileName, NULL);
    if(0 == dwInfoSize)
    return FALSE;

    char *cVersionInfo = NULL;
    if(NULL == (cVersionInfo = new char[dwInfoSize]))
    return FALSE;

    if(0 == GetFileVersionInfo((LPSTR)lpszFileName, NULL, dwInfoSize, cVersionInfo))
    {
    delete cVersionInfo;
    cVersionInfo = NULL;
    return FALSE;
    }

    UINT uLen = 0;
    DWORD* lpBuffer;
    char szName[64];
    if(0 == VerQueryValue(cVersionInfo, TEXT("\\VarFileInfo\\Translation"), (LPVOID *)&lpBuffer, &uLen))
    {
    delete cVersionInfo;
    cVersionInfo = NULL;
    return FALSE;
    }
    sprintf( szName, "\\StringFileInfo\\%04hX%04hX\\FileVersion",
    LOWORD(*lpBuffer), HIWORD(*lpBuffer)) ;

    char *lpInfo, *p1, *p2;
    if(0 == VerQueryValue(cVersionInfo, szName, (LPVOID *)&lpInfo, &uLen))
    {
    delete cVersionInfo;
    cVersionInfo = NULL;
    return FALSE;
    }

    p1 = lpInfo;
    for(int i=0; i<=3; i++)
    {
    p2 = szName;
    while(*p1 && ',' != *p1 && '.' != *p1)
    *p2++ = *p1++;
    *p2 = 0;
    if(*p1)
    p1++;
    VerInfo[i]=atoi(szName);
    }

    delete cVersionInfo;
    cVersionInfo = NULL;
    return TRUE;
    }
      

  3.   

    上面topwork(日光) 的方法我也会,我想找一个简单的方法,读取自己程序资源中的版本信息,谢谢,我会给你加分的
      

  4.   

    个例子就是查询任何可执行文件的版本信息
    并且 C++builder 和 VC 都通用,只需要把 AnsiString 替换成 CString 就行了。
    下面是完整例子:
    CString IS_GetAppVersion(char* AppName)
    {
    CString AppVersion;
    //AppVersion=IS_GetAppCreateTime(AppName); DWORD RessourceVersionInfoSize;
    DWORD JustAJunkVariabel;
    char* VersionInfoPtr;
    struct LANGANDCODEPAGE {
      WORD wLanguage;
      WORD wCodePage;
    } *TranslationPtr;
    char* InformationPtr;
    UINT  VersionInfoSize;
    char  VersionValue[255];    RessourceVersionInfoSize=GetFileVersionInfoSize(AppName,&JustAJunkVariabel);
        if(0!=RessourceVersionInfoSize)
        {
            VersionInfoPtr=new char[RessourceVersionInfoSize];
                if(GetFileVersionInfo(AppName,0,RessourceVersionInfoSize,VersionInfoPtr))
                {
                 if(!VerQueryValue(
                     VersionInfoPtr,
                     TEXT("VarFileInfo\\Translation"),
                        (LPVOID*)&TranslationPtr,
                        &VersionInfoSize))
                        {
                delete[] VersionInfoPtr;
                            return AppVersion;
                        }
                }     // retrieve File Description
    wsprintf(VersionValue,
                 TEXT("\\StringFileInfo\\%04x%04x\\FileVersion"),
                TranslationPtr[0].wLanguage,
                 TranslationPtr[0].wCodePage);    if(!VerQueryValue(
                 VersionInfoPtr,
                    VersionValue,
                    (LPVOID*)&InformationPtr,
                    &VersionInfoSize))
                    {
                     delete[] VersionInfoPtr;
                        return AppVersion;
                    }
    if(strlen(InformationPtr)>0) //Not Null
                {
                 AppVersion=CString(InformationPtr);
                }
                delete[] VersionInfoPtr;
        }
        return AppVersion;
    }void CGetFileVersionDlg::OnButton1() 
    {
    CString strVersion = IS_GetAppVersion("d:\\winnt\\winhlp32.exe");
    AfxMessageBox(strVersion);
    }
      

  5.   

    http://blog.csdn.net/taianmonkey/archive/2004/06/29/29762.aspx
      

  6.   

    那就用GetFileVersionInfo呗
    呵呵~~楼上帖的Monkey的代码很好了。