SpecialBuild-String lässt sich aus Versionsinformationen nicht auslesen
-
Hallo Gemeinschaft,
ich erstelle mit BDS2006 eine Anwendung inklusive Versionsinformationen. Mir gelingt es mittels WinAPI-Funktion VerQueryValue(...) die Informationen zu Firmenname (CompanyName) und Dateibeschreibung (FileDescription) zur Laufzeit auf einem Label auszugeben.
Nun habe ich im BDS2006 unter "Projekt=>Optionen=>Versionsinformationen" zusätzlich das Häckchen für "Spezielles Build" gesetzt und in der Liste mit Schlüssel und Wert bei Schlüssel "Spezielles Build" einen Wert "Interne Version" eingetragen.
Diesen Wert kann ich leider zur Laufzeit nicht auf einem Label ausgeben... Weder im Debug-Build noch im Release-Build... VerQueryValue(...) gibt mir immer 0 (Name nicht vorhanden / angegebene Ressource ungültig) zurück. Ich gehe jedoch im Programm genauso vor, wie ich es direkt vorher bei Firmenname und Dateibeschreibung mache:if(RootInf->dwFileFlags == VS_FF_SPECIALBUILD){ // RootInf ist VS_FIXEDFILEINFO * unsigned int InfLen(0); char * pcInfoString; //... // Ausgabe auf Label funktioniert: astrTmp= "\\StringFileInfo\\" + astrLanguageAndCodepage + "\\CompanyName"; if(VerQueryValue(pVInf, astrTmp.c_str(), (void**) &pcInfoString, &InfLen)){ if(InfLen > 0) LblVersType->Caption= AnsiString(pcInfoString, InfLen); } // Keine Ausgabe auf Label: astrTmp= "\\StringFileInfo\\" + astrLanguageAndCodepage + "\\SpecialBuild"; if(VerQueryValue(pVInf, astrTmp.c_str(), (void**) &pcInfoString, &InfLen)){ if(InfLen > 0) // <= wird nie geprüft (Haltepunkt im Debugger wird nicht angesprungen) LblVersType->Caption= AnsiString(pcInfoString, InfLen); } //... }
Hat jemand eine Idee, was da los ist? Es scheint, als würde "SpecialBuild" nicht in den Versioninformationen vorhanden sein... Danke für alle Hinweise!
MfG
-
Habe grade versucht im BCB 2009 dem SpecialBuild einen Wert mit anzugeben.
Im Datei Explorer (Eigenschaftendetails) wird der Wert auch nicht angezeigt,
somit könnte es sein das der Wert nicht mit übernommen wird?
-
Danke für die Anregung! Ich habe es nochmal geprüft:
WinXP Pro SP3 -> Windows-Explorer -> Rechtsklick auf Anwendung (*.exe) -> Eigenschaften -> Registerkarte "Version" gewählt -> Tabelle mit Versionsinformationen: Elementname: "Spezielles Build" - Wert: "Interne Version".
Die Information ist also in der Datei hinterlegt!Ich habe auch nur ein einziges Sprache-Codeseite-Paar mit VerQueryValue(..., "\\VarFileInfo\\Translation", ...) gefunden, es kann also meiner Meinung nach nicht sein, dass die Information woanders steht...
Ich bin ratlos - weitere Hinweise?
MfG
-
Nachdem so viele befruchtende Antworten und Hinweise eingegangen sind , möchte ich jemanden aus dem Moderatorenteam bitten, mich (bzw. diesen Thread) ins WinAPI-Forum zu verschieben! Vielleicht hab ich da mehr Glück...
Vielen Dank
-
Dieser Thread wurde von Moderator/in Jansen aus dem Forum VCL (C++ Builder) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
hast du dir das schonmal angeschaut: http://www.bytesandmore.de/rad/cpp/snipp/sc06001.php, läßt wahrscheinlich auch für SpecialBuild erweitern
[Edit]folgender Quellcode gibt bei mir auch das SpecialBuild aus:
DWORD DWD; // Read size of info block. DWORD VerInfoSize = GetFileVersionInfoSize(Application->ExeName.c_str(),&DWD); if (VerInfoSize) { char *VerInfo = new char[VerInfoSize]; // Read info block. if (!GetFileVersionInfo(Application->ExeName.c_str(),0,VerInfoSize,VerInfo)) RaiseLastWin32Error(); struct LANGANDCODEPAGE { WORD wLanguage; WORD wCodePage; } *lpTranslate; UINT cbTranslate; // Read the list of languages and code pages. VerQueryValue(VerInfo, TEXT("\\VarFileInfo\\Translation"), (LPVOID*)&lpTranslate, &cbTranslate); // Read the file description for each language and code page. String SubBlock; wchar_t *LangInfo; UINT LangSize; for( UINT i=0; i < (cbTranslate/sizeof(struct LANGANDCODEPAGE)); i++ ) { SubBlock.printf(_T("\\StringFileInfo\\%04x%04x\\ProductName"),lpTranslate[i].wLanguage,lpTranslate[i].wCodePage); VerQueryValue(VerInfo,SubBlock.c_str(),&(void*)LangInfo,&LangSize); Label1->Caption = LangInfo; SubBlock.printf(_T("\\StringFileInfo\\%04x%04x\\FileVersion"),lpTranslate[i].wLanguage,lpTranslate[i].wCodePage); VerQueryValue(VerInfo,SubBlock.c_str(),&(void*)LangInfo,&LangSize); Label2->Caption = LangInfo; SubBlock.printf(_T("\\StringFileInfo\\%04x%04x\\SpecialBuild"),lpTranslate[i].wLanguage,lpTranslate[i].wCodePage); VerQueryValue(VerInfo,SubBlock.c_str(),&(void*)LangInfo,&LangSize); Label3->Caption = LangInfo; } delete[] VerInfo; }