CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Funkcja odczytująca wersję programu
Strona 1 z 1

Funkcja odczytująca wersję programu

Nowy postNapisane: czwartek, 29 listopada 2012, 00:12
przez Pitek
Witam, wiem ze ten temat był poruszany już nie raz ale może tym razem u da się go wyjaśnić do końca.
Mianowicie przy mapowaniu ustawionym na wchar_t i przy poniższym kodzie funkcji oraz jej wywołaniu (zapisane tak bo mieści się w MessageBox'ie).
Funkcja zwracam mi tylko wartość Major version a chciałbym otrzymać pełen obraz aż do Build.
Co robię źle lub co należy zmienić aby to uzyskać ?
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------
String GetFileVersionInfo(wchar_t *ModulePath, String KeyName)
{
 LPVOID lpStr1 = NULL, lpStr2 = NULL;
 WORD* wTmp;
 DWORD dwHandlev = NULL;
 UINT dwLength;
 wchar_t sFileName[1024] = {0};
 wchar_t sTmp[1024] = {0};
 String sInfo;
 LPVOID* pVersionInfo;

 if(ModulePath == NULL) GetModuleFileName(NULL, sFileName, 1024);
 else wcscpy(sFileName, (LPTSTR)ModulePath);

 DWORD dwInfoSize = GetFileVersionInfoSize(sFileName, &dwHandlev);
 if(dwInfoSize)
 {
  pVersionInfo = new LPVOID[dwInfoSize];
  if(GetFileVersionInfo(sFileName, dwHandlev, dwInfoSize, pVersionInfo))
  {
   if(VerQueryValue(pVersionInfo, L"\\VarFileInfo\\Translation", &lpStr1, &dwLength))
   {
        wTmp = (WORD*)lpStr1;
        swprintf(sTmp, ("\\StringFileInfo\\%04x%04x\\" + KeyName).w_str(), *wTmp, *(wTmp + 1));
        if(VerQueryValue(pVersionInfo, sTmp, &lpStr2, &dwLength)) sInfo = (LPSTR)lpStr2;
   }
  }
  delete[] pVersionInfo;
 }
 return sInfo;
}
//--------------------------------
Wywołanie :
KOD cpp:     UKRYJ  
...GetFileVersionInfo(NULL, "FileVersion").w_str()...

Re: Funkcja odczytująca wersję programu

Nowy postNapisane: czwartek, 29 listopada 2012, 00:48
przez Cyfrowy Baron
Ten kod u mnie działa prawidłowo i pobiera całą wersję pliku o ile plik całą wersję posiada:

Warunkiem prawidłowego działania kodu jest środowisko C++Builder 2010 w wersji co najmniej 14.0.3615.26342, czyli chyba z ostatnią poprawką bodajże Update 5. Bez poprawek środowisko zawiera wiele błędów, w tym błąd nie tyle z odczytywaniem wersji programu ile z jej nadawaniem programowi. Jeśli masz starszą wersję to nic na tym polu nie wskórasz, gdyż kompilator źle zapisuje wersję programu podczas kompilacji.