CString CAboutDlg::GetVersions()
{
#pragma comment (lib, "Version.lib")
TCHAR szFullPath[MAX_PATH];
DWORD dwVerInfoSize = 0;
DWORD dwVerHnd;
CString strVersion;
VS_FIXEDFILEINFO * pFileInfo; GetModuleFileName(NULL, szFullPath, sizeof(szFullPath));
dwVerInfoSize = GetFileVersionInfoSize(szFullPath, &dwVerHnd); if (dwVerInfoSize)
{
HANDLE  hMem;
LPVOID  lpvMem;
unsigned int uInfoSize = 0; hMem = GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize);
lpvMem = GlobalLock(hMem);
GetFileVersionInfo(szFullPath, dwVerHnd, dwVerInfoSize, lpvMem);

if(::VerQueryValue(lpvMem, (LPTSTR)_T("//"), (void**)&pFileInfo, &uInfoSize))
{
WORD m_nProdVersion[4]; m_nProdVersion[0] = HIWORD(pFileInfo->dwProductVersionMS); 
m_nProdVersion[1] = LOWORD(pFileInfo->dwProductVersionMS);
m_nProdVersion[2] = HIWORD(pFileInfo->dwProductVersionLS);
m_nProdVersion[3] = LOWORD(pFileInfo->dwProductVersionLS); 
strVersion.Format(_T("%d.%d.%d.%d"),m_nProdVersion[0],
m_nProdVersion[1],m_nProdVersion[2],m_nProdVersion[3]);
}
}
return strVersion;
}红色的地方 执行失败了,我想问问GetFileVersionInfo的第一个参数地址是什么地址呢?执行的EXE是嘛?然后他从哪里找到的版本信息呢?

解决方案 »

  1.   

    自己看我以前的一个例子吧
    TCHAR* szFileName; 
    DWORD dwSize = GetFileVersionInfoSize((LPCWSTR)szFileName,NULL); 
    DWORD a = GetLastError();
    LPVOID pBlock = malloc(dwSize);   
    GetFileVersionInfo((LPCWSTR)szFileName,0,dwSize,pBlock);   char* pVerValue = NULL;   
    UINT nSize = 0;   
    VerQueryValue(pBlock,TEXT("\\VarFileInfo\\Translation"),(LPVOID*)&pVerValue,&nSize);   CString strSubBlock,strTranslation,strTemp;   
    strTemp.Format(L"000%x",*((unsigned short int *)pVerValue));   
    strTranslation   =   strTemp.Right(4);   
    strTemp.Format(L"000%x",*((unsigned short int *)&pVerValue[2]));   
    strTranslation   +=   strTemp.Right(4);   
    //080404b0为中文,040904E4为英文   strSubBlock.Format(L"\\StringFileInfo\\%s\\ProductVersion",strTranslation);   
    VerQueryValue(pBlock,strSubBlock.GetBufferSetLength(256),(LPVOID*)&pVerValue,&nSize);   
    strSubBlock.ReleaseBuffer();   
    strTemp.Format(L"产品版本:   %s",pVerValue);   
    AfxMessageBox(strTemp);   
      

  2.   

    BOOL VerQueryValue(          const LPVOID pBlock,
        LPTSTR lpSubBlock,
        LPVOID *lplpBuffer,
        PUINT puLen
    );
    pBlock
    [in] Pointer to the buffer containing the version-information resource returned by the GetFileVersionInfo function. if (VerQueryValue(szVersionBuffer, _T("\\"), (void**)&pInfo, &nInfoLen)) 
    {
       //Add Code
    }