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;
    }
    

Anmelden zum Antworten