Version einer Exe auslesen
-
Hi,
//--------------------------------------------------------------------------- #pragma hdrstop #include <string> #include <iostream> #include <windows.h> //--------------------------------------------------------------------------- using namespace std; #pragma argsused typedef DWORD (*GetInfoSize)(LPTSTR,LPDWORD); typedef BOOL (*GetInfo)(LPTSTR,DWORD,DWORD,LPVOID); class LoadLibary{ public: LoadLibary(); ~LoadLibary(); GetInfoSize GetFileVersionInfoSize; GetInfo GetFileVersionInfo; private: HINSTANCE hDLL; }; LoadLibary::LoadLibary(){ hDLL = LoadLibrary("version.dll"); if (hDLL != NULL) { GetFileVersionInfoSize = (GetInfoSize)GetProcAddress(hDLL,"GetFileVersionInfoSizeA"); if (!GetFileVersionInfoSize) { FreeLibrary(hDLL); throw ((std::string)"Couldn't load GetFileVersionInfoSize!"); } GetFileVersionInfo = (GetInfo)GetProcAddress(hDLL,"GetFileVersionInfoA"); if (!GetFileVersionInfo) { FreeLibrary(hDLL); throw ((std::string)"Couldn't load GetFileVersionInfo!"); } } } LoadLibary::~LoadLibary(){ FreeLibrary(hDLL); } int main(int argc, char* argv[]) { char * Buffer = NULL; try{ LoadLibary Libary; string File; getline(cin,File); int BufSize = Libary.GetFileVersionInfoSize( const_cast<char *>(File.c_str()), NULL ); if ( !BufSize )throw ((string)"GetFileVersionInfoSize failed"); Buffer = new char[BufSize]; if ( !Libary.GetFileVersionInfo( const_cast<char *>(File.c_str()), NULL, BufSize, (LPVOID)Buffer ) ){ throw ((string)"GetFileVersionInfo failed"); } } catch ( string sError ){ cout << "Error: " << sError; if ( Buffer != NULL )delete[] Buffer; return 1; } UINT uLen; VS_FIXEDFILEINFO *lpFfi; VerQueryValue( Buffer , _T("\\") , (LPVOID *)&lpFfi , &uLen ); DWORD dwLeftMost = HIWORD(lpFfi->dwFileVersionMS); DWORD dwSecondLeft = LOWORD(lpFfi->dwFileVersionMS); DWORD dwSecondRight = HIWORD(lpFfi->dwFileVersionLS); DWORD dwRightMost = LOWORD(lpFfi->dwFileVersionLS); cout << "Version: "<< (int)dwLeftMost << ":" << (int)dwSecondLeft << ":" << (int)dwSecondRight << ":" << (int)dwRightMost <<endl; delete[] Buffer; return 0; } //---------------------------------------------------------------------------
mein problem ist, das zwar der buffer eingelesen wird und das alles soweit klappt, nur die version die angezeigt wird stimmt nicht mit der der windows info der datei überein
-
Kann es sein, dass die binäre Versionsinformation und die textuale Versionsinformation bei der Testdatei unterschiedlich sind?
-
könnte sein, wie kommt man an die textuale info?
-
in der FAQ gibt es doch ein gutes Beispiel dazu
-
okay hab meine original version am laufen, nur wieso das jetzt geht und was wsprintf genau macht chek ich net ganz
... UINT uLen; VS_FIXEDFILEINFO *lpFfi; VerQueryValue( Buffer , _T("\\") , (LPVOID *)&lpFfi , &uLen ); DWORD dwLeftMost = HIWORD(lpFfi->dwFileVersionMS); DWORD dwSecondLeft = LOWORD(lpFfi->dwFileVersionMS); DWORD dwSecondRight = HIWORD(lpFfi->dwFileVersionLS); DWORD dwRightMost = LOWORD(lpFfi->dwFileVersionLS); delete[] Buffer; char szTmp[50]; wsprintf( szTmp,_T( "%d.%d.%d.%d" ),dwLeftMost,dwSecondLeft,dwSecondRight,dwRightMost ); cout << dwLeftMost<<"."<<dwSecondLeft<<"."<<dwSecondRight<<"."<<dwRightMost<<endl; return 0; }