DWORD CDllExDlg::SHGetVersionOfFile(LPTSTR szFile, LPTSTR szBuf, LPINT lpiBuf, int iNumOfFields)
{
DWORD dwUseless =0 ;
UINT iBufSize = 0;
VS_FIXEDFILEINFO* lpFFI=NULL;
TCHAR s[MAX_PATH] = {0};

DWORD dwLen = GetFileVersionInfoSize(szFile, &dwUseless);

if(dwLen==0)
{
if(szBuf)
lstrcpy(szBuf, _TEXT("<unknown>"));

return 0;
}

HGLOBAL lpVI = GlobalAlloc(GHND, dwLen);
LPVOID lpvMem = GlobalLock(lpVI);
::GetFileVersionInfo(szFile, NULL, dwLen, lpvMem);
VerQueryValue(lpvMem, _TEXT("\\"),reinterpret_cast<LPVOID*>(&lpFFI), &iBufSize);
DWORD dwVer1 = lpFFI->dwFileVersionMS;
DWORD dwVer2 = lpFFI->dwFileVersionLS;


GlobalUnlock(lpVI);

GlobalFree(lpVI);

//Fill return buffers

if(szBuf!=NULL)
{

wsprintf(s, _TEXT("%d.%d.%d.%d"), HIWORD(dwVer1), LOWORD(dwVer1),HIWORD(dwVer2),LOWORD(dwVer2));
lstrcpy(szBuf, s);

}

if(lpiBuf != NULL)
{

for(int i=0; i<iNumOfFields; i++)
{

if(i==0)
lpiBuf[i] = HIWORD(dwVer1);

if(i==1)
lpiBuf[i] = LOWORD(dwVer1);

if(i==2)
lpiBuf[i] = HIWORD(dwVer2);

if(i==3)
lpiBuf[i] = LOWORD(dwVer2);

}

}

return dwVer1;
}

 

+ Recent posts