Versionsnummer einer Windowsdatei auslesen

Alles rund um die Programmierung mit Qt
Antworten
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Versionsnummer einer Windowsdatei auslesen

Beitrag von BartSimpson »

Hallo, hat jemand eine Idee, wie ich die Versionsnummer einer Windows Datei auslesen kann? Ich weis, das Qt dafür nix hat, da es ja Windows typisch ist. Aber vielleicht hat doch jemand etwas Code für mich:)
ChMaster
Beiträge: 252
Registriert: 23. Februar 2005 14:44
Wohnort: RP -> Alzey
Kontaktdaten:

Beitrag von ChMaster »

hi,

ich kann dir sagen wie es in Visual Basic .Net geht :cool:, aber unter Qt kenn ich
solch eine lösung nicht, mit hoher warscheinlichkeit kann QFileInfo das, bin
mir aber in der hinsicht nicht sicher...., ein versuch ist es alle mal wert, sonst
schau mal in diversen Qt büchern nach die du bei dir rumliegen hast ...
GOOGLE.DE/LINUX hilft bei solchen fällen auch ab und zu mal :D
ChMaster
------------ Projekte------------
DBoxFE
DMS
First4 (Plugin-Develper)
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

in C++ würde es mir auch reichen. bze es muss reines c++ sein, da es im Qt kit nix passendes gibt. Oder man müste sich eine Klasse selber bauen, stellt sich nur frage, wie man den Part sicher in der exe/dll findet. Ich Weis nur, das das am Ende ser Datei steht.
ChMaster
Beiträge: 252
Registriert: 23. Februar 2005 14:44
Wohnort: RP -> Alzey
Kontaktdaten:

Beitrag von ChMaster »

genauere erklärung bitte ... :)

-----
am ende welcher datei, wo die version drin steht?
-----

wenn die versionsnummer am ende der datei steht, wäre es doch
einfach die datei auszulesen und danach zu suchen (ist mein vorschlag jetzt)
wenn ich dich soweit richtig verstanden habe ... :)
ChMaster
------------ Projekte------------
DBoxFE
DMS
First4 (Plugin-Develper)
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Nur weis ich nicht ,wie man die Stelle sicher in einder Datei erkennen kann:(
Im Systemverzeichnis von Windows gib es eine Dateon von MS Names version.dll Die genau das können soll. Hat jemand eine Idee, wie man die benutzen könnte?
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

So jetzte bionn ich in der Win32API fündig geworden. Nur leider stoplte ioch an der 1. Stelle. hier der Code:

Code: Alles auswählen

QFile Datei("c:\\Windows\\explorer.exe");
	DWORD Infoblockgroesse;
	DWORD Datenmuell;
    Infoblockgroesse=::GetFileVersionInfoSize(Datei.fileName().toUtf8(),&Datenmuell);
	if(Infoblockgroesse==0)
	{
		//wenn 0 denn Fehler
		qDebug() <<"Fehler";
	}
	else
	{
		//größe gefunden
		qDebug() <<"Der Infoblock ist"<<Infoblockgroesse<<"Byte gross";
	}
nur da spielt der Compiler nicht mit:( Es sagt:
haupt.cpp:12: error: conversion from `QByteArray' to `WCHAR*' is ambiguous
C:/c++/Qt/4.0.0/include/QtCore/../../src/corelib/tools/qbytearray.h:322: note: candidates are: QByteArray::operator const void*() const <near match>
C:/c++/Qt/4.0.0/include/QtCore/../../src/corelib/tools/qbytearray.h:289: note: QByteArray::operator QNoImplicitBoolCast() const <near mat
>
haupt.cpp:25:2: warning: no newline at end of file
mingw32-make[1]: *** [tmp\obj\haupt.o] Error 1
Was nun?
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Ok das Probelm ist behoben. Abrt nun kommt das nächste. Die Blockgröße ist immer 0:( Doch das kann nicht sein:(
Hier der neue Code:

Code: Alles auswählen

Application a(argc, argv);
	
	QString Datei("c:\\Windows\\explorer.exe");
	DWORD Infoblockgroesse;
	DWORD Datenmuell;
	Infoblockgroesse=::GetFileVersionInfoSize((WCHAR*)&Datei.toUtf8(),&Datenmuell);
	if(Infoblockgroesse==0)
	{
		//wenn 0 denn Fehler
		qDebug() <<"Fehler";
	}
	else
	{
		//größe gefunden
		qDebug() <<"Der Infoblock ist"<<Infoblockgroesse<<"Byte gross";
	}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Du musst ein wchar übergeben und nicht char. GetLastError() gibt dir unter Garantie die Fehlermeldung "Datei nicht gefunden"...

-> unter Qt3: toUcs2()
-> unter Qt4: toUtf16()

Ausserdem würde ich zur Sicherheit GetFileVersionInfoSizeW benutzen
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Nee Das mit dem String muss so sein.
jetzte geht alles. jetzt muss ich nur schauen, ob die Versionsnnumer auch passen:)
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

BartSimpson hat geschrieben:Nee Das mit dem String muss so sein.
Utf8 ist eine 8-Bit Kodierung, wie soll es dann funktionieren wen du GetFileVersionInfoSizeW aufrufst (was du zweifelsohne machst)?
Und wenn Du GetFileVersionInfoSizeA benutzen würdest muss toLatin1() oder toLocal8Bit() verwendet werden.
Wobei seit Qt4 immer noch ein .constData() rangehängt werden muss da dies (leider) nicht mehr automatisch geschieht.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

So jetzte ist das Wunderwerk vollbracht. Hier ist der Code:

Code: Alles auswählen

int main(int argc, char *argv[])
{	
	QApplication a(argc, argv);
	
	QString Datei("c:\\Windows\\explorer.exe");
	DWORD Infoblockgroesse;
	DWORD Datenmuell;
	char *Infoblock=0;
	UINT LaengeDerInfo;
	VS_FIXEDFILEINFO *FesteInfo;
	//WCHAR=16 Bit
	Infoblockgroesse=::GetFileVersionInfoSize((WCHAR*)Datei.utf16(),&Datenmuell);
	if(Infoblockgroesse==0)
	{
		//wenn 0 denn Fehler
		qDebug() <<"Fehler beim Lesen der Infoblockgroesse";
	}
	else
	{
		//größe gefunden
		qDebug() <<"Der Infoblock ist"<<Infoblockgroesse<<"Byte gross";
		Infoblock=new char[Infoblockgroesse];
		if(!::GetFileVersionInfo((WCHAR*)Datei.utf16(),0,Infoblockgroesse,Infoblock))
		{
			//wenn false denn Fehler
			qDebug() <<"Fehler beim Lesen des Infoblockes";
		}
		else
		{
			qDebug()<<"Infoblock gelesen";
			if(!::VerQueryValue(Infoblock,(WCHAR*)QString("\\").utf16(),(void**)&FesteInfo,&LaengeDerInfo))
			{
				//Auswetung fehlgeschlagen
				qDebug()<<"Auswertung der Dateiversionsnummer Fehlgeschlagen";
			}
			else
			{
				qDebug()<<"Version:"<<HIWORD(FesteInfo->dwFileVersionMS)<<"."
					<<LOWORD(FesteInfo->dwFileVersionMS)<<"."<<HIWORD(FesteInfo->dwFileVersionLS)
					<<"."<<LOWORD(FesteInfo->dwFileVersionLS);
			}
		}
		delete Infoblock;
	}
	
	return a.exec();
}

Mag vielleicht nicht Optimal sein, aber es geht erst mal :D
Cospieler
Beiträge: 11
Registriert: 20. Januar 2012 09:03

Re: Versionsnummer einer Windowsdatei auslesen

Beitrag von Cospieler »

Versionsnummer einer Windowsdatei auslesen

Habe ich zwar hier im Forum gefunden.
Aber ihrgendwie bekomme ich nichts passendes zum laufen. Bitte um Unterstützung.

Also ich habe in QT Creater ein .ui gebaut mit folgenden Elementen:
Ein Textfeld in dem man den Pfad zur Datei eingeben kann die abgefragt werden soll.
Einen Run Button zum Start den vorgangs,
mit der Funktion die ausgewählte Datei auszulesen und dann in einem
separaten Textfeld die Version anzeigen zu lassen.

Nur der Passende Scrpit bekomme ich nicht hin.
Wie gesagt. Bitte um hilfe.

Danke im vorraus.

Gruß Cospieler
Bin noch Anfänger, bitte um Verständnis.
Antworten