Cum pot schimba versiunea de program automat ?

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
mesajflaviu
Membru++
Membru++
Posts: 686
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Cum pot schimba versiunea de program automat ?

Post by mesajflaviu » 03 Jan 2011, 14:18

Se poate schimba numarul versiunii de program automat , pentru cazul cand programul isi face update ?



User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Cum pot schimba versiunea de program automat ?

Post by Marius Bancila » 03 Jan 2011, 17:43

Sa schimbi unde? Vrei sa modifici informatiile din tabela de version information? Atunci uita-te la linkurile astea:
http://www.codeguru.com/tools/standalon ... .php/c1403
http://www.the-software-box.com/changeversion.aspx
http://stackoverflow.com/questions/2842 ... ng-exe-dll
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

mesajflaviu
Membru++
Membru++
Posts: 686
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Cum pot schimba versiunea de program automat ?

Post by mesajflaviu » 03 Jan 2011, 18:20

Da , asa vrea sa schimb din tabela de version information ( VS_VERSION_INFO din resurse ) , pentru ca in AboutDlg afisez valoarea de acolo.

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Cum pot schimba versiunea de program automat ?

Post by Marius Bancila » 03 Jan 2011, 23:37

Explica-ne putin. Tu ai sursele si vrei sa modifici in surse? Sau ai doar un DLL si vrei sa-i modifici numarul de versiune? Daca vrei sa modifici direct in surse e foarte simplu. O faci fie din Resource editor fie direct in fisierul .rc, unde ai o zona de genul:

Code: Select all

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 1,0,0,1
 PRODUCTVERSION 1,0,0,1
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x4L
 FILETYPE 0x1L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904e4"
        BEGIN
            VALUE "CompanyName", "TODO: <Company name>"
            VALUE "FileDescription", "TODO: <File description>"
            VALUE "FileVersion", "1.0.0.1"
            VALUE "InternalName", "DemoMFC.exe"
            VALUE "LegalCopyright", "TODO: (c) <Company name>.  All rights reserved."
            VALUE "OriginalFilename", "DemoMFC.exe"
            VALUE "ProductName", "TODO: <Product name>"
            VALUE "ProductVersion", "1.0.0.1"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1252
    END
END
In loc de 1,0,0,1 si 1.0.0.1 pui ce vrei.

Daca tu vrei asta automat, atunci exista unele add-onuri, sau macrouri pentru asta.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Cum pot schimba versiunea de program automat ?

Post by Silviu Ardelean » 04 Jan 2011, 02:56

O versiune mai flexibila ar fi sa ai un header file special gen "version.h" cu doua constante ce sa fie modificate doar in momentul in care faci un build de release/kit (poti face un script .VBS pentru asta).

Code: Select all

#define PRODUCT_VERSION      1.2.3.4
#define PRODUCT_VERSION_STR  "1.2.3.4"
Apoi sa modifici si sa utilizezi aceste constante in fisierul de resurse you_project.rc sau your_project.rc2 in zonele in care vrei sa folosesti aceste constante.

Code: Select all

#include "version.h"

VS_VERSION_INFO VERSIONINFO
 FILEVERSION PRODUCT_VERSION
 PRODUCTVERSION PRODUCT_VERSION
 FILEFLAGSMASK 0x17L
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x4L
 FILETYPE 0x2L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "000004b0"
        BEGIN
            VALUE "CompanyName", "YourCompany"
            VALUE "FileDescription", "bla bla"
            VALUE "FileVersion", PRODUCT_VERSION_STR
            VALUE "InternalName", "bla bla 2"
            VALUE "LegalCopyright", "Copyright © YourCompany"
            VALUE "OriginalFilename", "youApp.exe"
            VALUE "ProductName", "yourProductName"
            VALUE "ProductVersion", PRODUCT_VERSION_STR
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x0, 1200
    END
END

mesajflaviu
Membru++
Membru++
Posts: 686
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Cum pot schimba versiunea de program automat ?

Post by mesajflaviu » 04 Jan 2011, 09:53

Setez versiunea de prorgam din editorul mediului de programare , si la run time citesc in modul urmator versiunea :

Code: Select all

void CAboutApplicationPage::GetAppVersion(CString &sVersion)
{
	DWORD dwDummy = 0;
	CString sAppFileName;
	try
	{
		::GetModuleFileName(NULL,sAppFileName.GetBuffer(_MAX_PATH),_MAX_PATH);
		sAppFileName.ReleaseBuffer();

		LPTSTR lpAppFileName = sAppFileName.GetBuffer(0);
		DWORD dwSize = ::GetFileVersionInfoSize(lpAppFileName,&dwDummy);
		LPBYTE lpData = new BYTE[dwSize];
		if(::GetFileVersionInfo(lpAppFileName,0,dwSize,lpData))
		{
			LPTSTR lpBuffer = NULL;
			CString sSubBlock = _T("\\StringFileInfo\\040904b0\\ProductVersion");
			UINT nLenght = 0;
			if(::VerQueryValue(lpData,sSubBlock.GetBuffer(0),reinterpret_cast<void **>(&lpBuffer),&nLenght))sVersion = lpBuffer;
			LANGID lid = ::GetUserDefaultLangID();
			sSubBlock.ReleaseBuffer();
		}
		sAppFileName.ReleaseBuffer();
		delete []lpData;
	}
	catch(CException* pException)
	{
		pException->Delete();
	}
}
si cu stringul sVersion setez un text in AboutDlg ... ma gandeam ca , in cazul unui update a programului compilat , pot modifica versiunea de program ca apoi s-o afisez in about dialog ...

User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: Cum pot schimba versiunea de program automat ?

Post by cristianamarie » 04 Jan 2011, 13:50

Incluzi in .rc si un _version.h al tau unde definesti ce trebuie.

Un _version.h al tau:

Code: Select all

#define MYPRODUCT_VERSION_MAJOR              1
#define MYPRODUCT_VERSION_MINOR              1
#define MYPRODUCT_VERSION_BUILDNUMBER       82
#define MYPRODUCT_VERSION_QFE                0

#define _STRING(x)	#x
#define STRING(x)	_STRING(x)
si in .rc un :

Code: Select all

...
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "_version.h"
...
2 TEXTINCLUDE 
BEGIN
    "#include ""_version.h""\r\n"
    "\0"
END
...
VS_VERSION_INFO VERSIONINFO
 FILEVERSION MYPRODUCT_VERSION_MAJOR,MYPRODUCT_VERSION_MINOR,MYPRODUCT_VERSION_BUILDNUMBER,MYPRODUCT_VERSION_QFE
 PRODUCTVERSION MYPRODUCT_VERSION_MAJOR,MYPRODUCT_VERSION_MINOR,MYPRODUCT_VERSION_BUILDNUMBER,MYPRODUCT_VERSION_QFE
 FILEFLAGSMASK 0x1fL
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x4L
 FILETYPE 0x2L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904b0"
        BEGIN
            VALUE "Comments", "*** comments placeholder ***"
            VALUE "CompanyName", "*** company ***"
            VALUE "FileDescription", "*** file description ***"
            VALUE "FileVersion", STRING(MYPRODUCT_VERSION_MAJOR) "." STRING(MYPRODUCT_VERSION_MINOR) "." STRING(MYPRODUCT_VERSION_BUILDNUMBER) "." STRING(MYPRODUCT_VERSION_QFE)
            VALUE "InternalName", "*** internal name ***"
            VALUE "LegalCopyright", "*** copyright ***"
            VALUE "OriginalFilename", "*** original filename ***"
            VALUE "ProductName", "*** product name ***"
			VALUE "ProductVersion", STRING(MYPRODUCT_VERSION_MAJOR) "." STRING(MYPRODUCT_VERSION_MINOR) "." STRING(MYPRODUCT_VERSION_BUILDNUMBER) "." STRING(MYPRODUCT_VERSION_QFE)
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1200
    END
END
Evident, poti sa definesti in _version.h constante si pentru celelalte treburi din version info, InternalName, OriginalFilename etc.

Dupa care in orice alt loc devine o chestie de inclus "_version.h" si CString::Format.

Code: Select all

...
	CStringW strVersion;
	strVersion.Format(L" %d.%d.%d.%d", 
		MYPRODUCT_VERSION_MAJOR, MYPRODUCT_VERSION_MINOR, 
		MYPRODUCT_VERSION_BUILDNUMBER, MYPRODUCT_VERSION_QFE);

	//	display strVersion in about dialog ...
..
Nuclear launch detected

mesajflaviu
Membru++
Membru++
Posts: 686
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Cum pot schimba versiunea de program automat ?

Post by mesajflaviu » 04 Jan 2011, 20:55

Multumesc tuturor pentru idei ... o sa vad cum rezolv ...

User avatar
MrSmersh
Microsoft MVP
Microsoft MVP
Posts: 289
Joined: 20 Jul 2007, 10:18
Location: Timisoara
Contact:

Re: Cum pot schimba versiunea de program automat ?

Post by MrSmersh » 05 Jan 2011, 00:47

Facusem in vremuri immemoriale modificarea de resurse compilate, si cu timp pot sa mai gasesc codul, sau notitele mele
Dar pentru afisat in about, noi am ales solutia lenesului de a afisa versiune pusa in setup care se gaseste prin registry, care si la patch, si la umpgrade trebuie sa se schimbe, macar minor versionu.
Daca vreune din idei te ajuta, zii si elaborez.

mesajflaviu
Membru++
Membru++
Posts: 686
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Cum pot schimba versiunea de program automat ?

Post by mesajflaviu » 05 Jan 2011, 10:44

Cred ca o sa adopt solutia de a pune versiunea de program prin registrii pe undeva ... nu vreau sa va pun la cautat pentru asa lucru ( relativ ) minor .
Deocamdata alte lucruri sant importante ...

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Cum pot schimba versiunea de program automat ?

Post by Silviu Ardelean » 05 Jan 2011, 11:07

La ce e util sa tii informatia asta in registri? Pentru a o afisa in fereastra de About? Daca, doar pentru atat, atunci... come on! Lucrurile sunt mult mai simple de atat.
Daca se merge pe ideea cu header-ul version.h acesta se poate folosi atat in fisierele de resurse cum s-a exemplificat mai sus iar pentru a pune in About (incluzi version.h si folosesti constanta dorita). Pentru ce sa te scarpini in urechi, pardon in registri? :)
Daca vrei sa faci mai elegant, iti faci si o metoda get ce intoarce consanta de product version si o folosesti.

User avatar
MrSmersh
Microsoft MVP
Microsoft MVP
Posts: 289
Joined: 20 Jul 2007, 10:18
Location: Timisoara
Contact:

Re: Cum pot schimba versiunea de program automat ?

Post by MrSmersh » 05 Jan 2011, 13:31

Aaaa, la ce e util sa o tii?
Pai asa s-a gindit MS ca e bine la toate setup sa pastreze automat product version din msi, al tuturor aplicatiilor instalate. Si daca incerci inca o data instalezi acceasi aplicatie se uita, daca vorbim de acceasi versiuni, e repair, daca minor e mai mare e upgrade, si daca e major, silent uninstall si reinstall. Sper ca nu am supra simplificat pina la dat in bara minor upgrade, major upgrade, da puristii o sa zica ca mai exista si small update, dar doar primele 2 se bazeaza pe product version. Si AFAIR (as far as I remember :biggrin: ) toate astea sint in registry, la guid instalare.
Revenind pe on topic, daca aplicatia are instalare nu trebuie scris explicit astea in registry, setup face automat, ci numai citite.

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Cum pot schimba versiunea de program automat ?

Post by Silviu Ardelean » 05 Jan 2011, 13:52

Catalin, indiferent de kitul instalat, daca folosesti ce spuneam eu, binarele produsului tau vor avea deja propietatile fisierului cu versiunea data cat si la About.
Si pana la urma, daca tot s-a dus discutia inspre kituri... si kit-urile pot utiliza "version.h". :)

User avatar
MrSmersh
Microsoft MVP
Microsoft MVP
Posts: 289
Joined: 20 Jul 2007, 10:18
Location: Timisoara
Contact:

Re: Cum pot schimba versiunea de program automat ?

Post by MrSmersh » 05 Jan 2011, 14:11

Setup are transparent astea, si daca ai mai multe executabile in aplicatie recte dll incepi sa mai complici putin problema... Doable da lenesul de mine ar cauta ceva mai simplu.
Acuma daca h din unele productivity tools de facut msi e compatibil cu cel "normal" de C cred ca e o discutie in sine, iarasi nu cred ca lenesul din mine s-ar lega la cap cu asta, mai ales ca product version trebuie sa il modific neaparat cind compilez un setup nou.

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Cum pot schimba versiunea de program automat ?

Post by Silviu Ardelean » 05 Jan 2011, 14:30

MrSmersh wrote: daca ai mai multe executabile in aplicatie recte dll incepi sa mai complici putin problema...
Nu o complici nimic daca organizezi cum trebuie solutia. :)
Pui fisierele comune in directorul radacina de surse sau intr-un folder de include comun tuturor proiectelor si ai pace.

Post Reply