Versionsinformationen auslesen

By dose | September 3, 2005
Under: technical stuff, Uncategorized

Oft implementiert man in seine Applikation einen About-Dialog, in dem man sich nicht nur selbst verewigt, sondern auch die Programmversion usw. anzeigt.
Hardcodet man nun diese Information, so hat man hier unnötige Doppelgleisigkeiten, da man die Versionsnummer normalerweise ja schon in der Versioninfo-Resource angibt.
Bei einem Programmupdate müsste man dann immer 2 Werte ändern, was man häufig vergisst.
Die Idee ist daher naheliegend, dass man sich für seinen About-Dialog gleich die Versionsinformationen aus der Versioninfo-Resource extrahiert. Unglücklicherweise ist dies weniger trivial, als man viell. ursprünglich annehmen möchte. Generell sollte man sich hierfür die Hilfe zur VerQueryValue-Funktion ansehen.
Hier sind auch die Strings beschrieben, die man aus der Versioninfo auslesen kann.
Nachdem für die Benutzung dieser Funktion jedoch einige Vorarbeiten notwendig sind, ist es praktisch, die Versionsabfrage in eine Klasse zu kapseln, welche im Konstruktor die Extraktion der Resourcen zur weiteren Verwendung durch VerQueryValue übernimmt und im Destruktor den Speicher wieder frei gibt.
Ich habe daher eine kleine Klasse implementiert, die diese Aufgabe übernimmt:

Diese lässt sich relativ bequem dann in der Window-Procedure the About-Dialogs einsetzen:

LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
  switch (message)
  {
    case WM_INITDIALOG:
    {
      try {
        char szDestBuf[256];
        QueryResource qr;

        _snprintf (szDestBuf, sizeof (szDestBuf), "%s\nVersion %s\n\n%s - %s\n\nAuthor: dose", qr.GetValue ("ProductName"), qr.GetValue ("ProductVersion"), qr.GetValue ("LegalCopyright"), qr.GetValue ("CompanyName") );
        SetDlgItemText (hDlg, IDC_VERSION, szDestBuf );
      }
      catch (QueryResource::xError) {}
      catch (bad_alloc) {}
      return TRUE;
    }
    case WM_COMMAND:
      switch (LOWORD(wParam))
      {
        case IDOK:
          EndDialog(hDlg, 0);
          break;
      }
      break;
    }
  return FALSE;
}

Leave a Comment

Name:

E-Mail :

Subscribe :
Website :

Comments :