Seite 1 von 1

Versionsnummer einer Windowsdatei auslesen

Verfasst: 12. August 2005 15:29
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:)

Verfasst: 12. August 2005 23:57
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

Verfasst: 13. August 2005 00:06
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.

Verfasst: 13. August 2005 00:09
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 ... :)

Verfasst: 13. August 2005 09:49
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?

Verfasst: 13. August 2005 17:14
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?

Verfasst: 13. August 2005 18:28
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";
	}

Verfasst: 13. August 2005 19:56
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

Verfasst: 13. August 2005 20:01
von BartSimpson
Nee Das mit dem String muss so sein.
jetzte geht alles. jetzt muss ich nur schauen, ob die Versionsnnumer auch passen:)

Verfasst: 13. August 2005 20:12
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.

Verfasst: 13. August 2005 20:32
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

Re: Versionsnummer einer Windowsdatei auslesen

Verfasst: 16. Februar 2015 13:42
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