Dzieje się tak dlatego, że środowisko C++ Builder 2009 operuje na zmiennych typu UnicodeString tutaj wchar_t, dlatego ten zapis:
- Kod: Zaznacz cały
("\\StringFileInfo\\%04x%04x\\" + KeyName)
we wcześniejszych wersjach środowiska jest domyślnie traktowany jako typ AnsiString funkcja c_str() konwertuje typ AnsiString na char, podczas gdy w wersji 2009 i nowszych powyższy zapis jest traktowany jako typ UnicodeString. Funkcja sprintf oczekuje argumentów typu char*, nie można jednak dokonać konwerski z typu UnicodeString na char za pomocą funkcji c_str(), trzeba użyć funkcji t_str().
Kolejna sprawa to, że wersja 2009 operuje na UnicodeString wiec deklaracja zmiennej typu String jest traktowana jako UnicodeString, inaczej niż we wcześniejszych wersjach gdy była traktowana jako AnsiString. Można tutaj używać typu AnsiString, gdyż środowisko dokona niejawnej konwersji do UnicodeString, nie jestem jednak pewien czy stanie sie tak w wersji 2009, ale w wersji 2010 na pewno zostanie wykonana niejawna konwersja na typ UniceString. Dla pewności lepiej jest jednak deklarować typ UniceString. Należałoby też zmienić typ LPSTR na LPCTSTR by uczynić go w pełni zgodnym z nowym standardem.
Popełniłem bład nadajac swojej funkcji nazwę
GetFileVersionInfo, gdyż funkcja o tej nazwie występuje już w bibliotekach środowiska C++Builder, dlatego w poniższym przykładzie zmieniłem nazwę funkcji na
myGetFileVersionInfo- Kod: Zaznacz cały
//---------------------------------------------------------------------------
UnicodeString myGetFileVersionInfo(char *ModulePath, UnicodeString KeyName)
{
LPVOID lpStr1 = NULL, lpStr2 = NULL;
WORD* wTmp;
DWORD dwHandlev = NULL;
UINT dwLength;
char sFileName[1024] = {0};
char sTmp[1024] = {0};
UnicodeString sInfo;
LPVOID* pVersionInfo;
if(ModulePath == NULL) GetModuleFileName(NULL, sFileName, 1024);
else strcpy(sFileName, ModulePath);
DWORD dwInfoSize = GetFileVersionInfoSize((char*)(LPSTR)sFileName, &dwHandlev);
if(dwInfoSize)
{
pVersionInfo = new LPVOID[dwInfoSize];
if(GetFileVersionInfo((char*)(LPCTSTR)sFileName, dwHandlev, dwInfoSize, pVersionInfo))
{
if(VerQueryValue(pVersionInfo, "\\VarFileInfo\\Translation", &lpStr1, &dwLength))
{
wTmp = (WORD*)lpStr1;
sprintf(sTmp, ("\\StringFileInfo\\%04x%04x\\" + KeyName).t_str(), *wTmp, *(wTmp + 1));
if(VerQueryValue(pVersionInfo, sTmp, &lpStr2, &dwLength)) sInfo = (LPCTSTR)lpStr2;
}
}
delete[] pVersionInfo;
}
return sInfo;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Label1->Caption = "Wersja pliku: " + myGetFileVersionInfo(NULL, "FileVersion");
}
//---------------------------------------------------------------------------