Toon posts:

[Delphi] versie uitlezen

Pagina: 1
Acties:
  • 169 views sinds 30-01-2008

Verwijderd

Topicstarter
Bij Delphi kan je via Project > Options de versiegegevens van je project bijhouden.

Volgens de help-functie kan je deze gegevens ook weer uitlezen. Het voorbeeld werkt echter niet. Sterker nog: Het voorbeeld kan niet eens gecompileerd worden. |:( Maar na de haakjes en comma's op de juiste plek te hebben gezet, kan zelfs het voorbeeld compileren. :) Deze werkt echter niet goed. |:(

Weet iemand hoe je WEL de versiegegevens uit kan lezen?

  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 17:49

Bergen

Spellingscontroleur

Van de gecompileerde exe bedoel je? Gewoon in je verkenner ofzo de eigenschappen van je exe opvragen, daar staat alles bij. Of bedoel je dat niet? :?

Verwijderd

Topicstarter
Dat bedoel ik niet echt.

In de versiegegevens staat het versie nummer. Dat versienummer wil ik graag op een formpje plempen.

Verwijderd

Als je nu eens met torry zoekt op TVersion. Krijg je vast heleboel interessante hits.
Zo is bijvoorbeeld voor als je Delphi 2 hebt fileinfo misschien bruikbaar.
Als je een hogere Delphi (3 of 4) versie hebt probeer dan TVersionView eens. Daar zit ook sources bij, dus als het dan niet werkt, kan je misschien daar wat wijs uit worden. Heb trouwens niks uitgeprobeerd, maar misschien ben je hier meegeholpen.

Verwijderd

Topicstarter
Ik denk dat ik daar op zich wel wat mee kan, maar waarom nieuwe bende installeren als het ook met de bestaande bende kan?

Ik heb nog het eea zitten uitpluizen en het voorbeeld blijft echt niet kloppen.

Het voorbeeld:
const
InfoNum = 10;
InfoStr: array[1..InfoNum] of string = ('CompanyName', 'FileDescription', 'FileVersion', 'InternalName', 'LegalCopyright', 'LegalTradeMarks', 'OriginalFileName', 'ProductName', 'ProductVersion', 'Comments');
var
S: string;
n, Len, i: DWORD;
Buf: PChar;
Value: PChar;
begin
S := Application.ExeName;
n := GetFileVersionInfoSize(PChar(S), n);
if n > 0 then
begin

Buf := AllocMem(n);
Memo1.Lines.Add('VersionInfoSize = ' + IntToStr(n));
GetFileVersionInfo(PChar(S), 0, n, Buf);
for i := 1 to InfoNum do
if VerQueryValue(Buf, PChar('StringFileInfo\040904E4\' + InfoStr[i]), Pointer(Value), Len) then //Hier klopten de haakjes iig niet
Memo1.Lines.Add(InfoStr[i] + ' = ' + Value);
FreeMem(Buf, n);
end
else
Memo1.Lines.Add('No version information found');
end;
De functie GetFileVersionInfo zou een bool terug moeten geven. Echter als ik deze waarde aan een eigen var toewijs en deze met een watch bekijk is deze nooit te zien, en krijg ik tijdens het uitvoeren van de functie de waarde
check: [process not accessible]
Nou heb ik echt van alles geprobeerd, maar ik krijg het niet aan de praat.

Iemand een ingeving of een oplossing?

Verwijderd

Weet verder niet hoe je je probleem moet oplossen, heb me nooit zo in versieinfo verdiept.
Weet waarschijnlijk wel hoe je aan "check: [process not accessible]" komt en hoe je daar vanaf komt.
Dit is dan een variable waar je iets instopt die je later nooit evalueerd. Delphi heeft dit dan weg geoptimaliseerd.

Oplossing:
A Je kent het aan variable toe waar je wel wat mee doet
B Project->Options->Compiler Vink daar optimization weg en hercompileer. Nu kan je wel je variable bekijken.

Verwijderd

Ik heb ff op internet voor je gekeken en heb het antwoord voor je. Gevonden op de site van : www.delphi3000.com
Article : http://www.delphi3000.com/articles/article_1374.asp


Zorg wel dat "Windows" in je uses clause staat.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// DWHi returns the high word in the DWord 
function DWHi(val : DWord) : word assembler; 
asm 
mov EAX, val; 
shr EAX,16; 
end; 

// DWHi returns the low word in the DWord 
function DWLo(val : DWord) : word assembler; 
asm 
mov EAX, val; 
end; 

// GetFileVersion fills the VerBlk with the version information from file "filename" 
// If no version information is avaible the function returns false, otherwise true 
function  GetFileVersion(filename : string; var VerBlk : VS_FIXEDFILEINFO) : boolean; 
var  InfoSize,puLen : DWord; 
     Pt,InfoPtr : Pointer; 
begin 
InfoSize := GetFileVersionInfoSize(PChar(filename),puLen); 
fillchar(VerBlk,sizeof(VS_FIXEDFILEINFO),0); 
if InfoSize > 0 then begin 
  GetMem(Pt,InfoSize); 
  GetFileVersionInfo(PChar(filename),0,InfoSize,Pt); 
  VerQueryValue(Pt,'\',InfoPtr,puLen); 
  move(InfoPtr^,VerBlk,sizeof(VS_FIXEDFILEINFO)); 
  FreeMem(Pt); 
  result := true; 
end else result := false; 
end; 

// GetProductVerStr formats the version info into a readable string 
function GetProductVerStr(VerBlk : VS_FIXEDFILEINFO) : string; 
begin 
result := Format('%u.%u.%u.%u', 
         [DWHi(VerBlk.dwProductVersionMS), 
        DWLo(VerBlk.dwProductVersionMS), 
        DWHi(VerBlk.dwProductVersionLS), 
        DWLo(VerBlk.dwProductVersionLS)]); 
end; 


procedure TForm1.Button1Click(Sender: TObject); 
var fileinfo : VS_FIXEDFILEINFO; 
begin 
if GetFileVersion(application.ExeName,fileinfo) then begin 
  label1.caption := GetProductVerStr(fileinfo); 
end else label1.caption := 'File did not contain version info'; 
end;

Succes ermee heb hem trouwens ook getest en hij werkt.

Verwijderd

Topicstarter
Thanx

Verwijderd

Ik moet uit het register een versienummer halen. Deze staat onder version, maar heeft waarschijnlijk verschillende waarden. Eén waarde die zeker is zijn getallen en een punt zoals 1.20. Bij verschillende versies echter is er versie: voorgezet. Nou zou ik graag willen weten hoe je dit weg kan laten zodat je alleen het 1.20 gedeelte overhoud.

niet op deze manier dus want dan heb je kans dat je alles weghaalt.
PHP:
4
5
RegVersion := Reg.ReadString('Version');
Delete(RegVersion, 1, 8);

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:08
Tja, beetje onzinnig om een oud topic dat over Delphi handelt te gaan schoppen met een PHP vraag niet?
Kijk eens naar de string-functies die beschikbaar zijn in PHP.

https://fgheysels.github.io/

Pagina: 1

Dit topic is gesloten.