2016-06-20 9 views
5

Obecnie pracuję nad projektem C++ VS2015, który wykonuje plik wykonywalny.Jak zatrzymać Visual Studio 2015 z twardego kodowania wersjami

Mam plik version.h, który po prostu definiuje kilka liczb.

#define VERSION_MAJOR    3 
#define VERSION_MINOR    0 
#define VERSION_REVISION   0 
#define VERSION_BUILD    2 
#define VER_FILE_VERSION   VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION, VERSION_BUILD 
... 

Ten version.h jest używany w pliku .rc projektu w celu określenia informacji o wersji pliku wykonywalnego.

Plik .RC wygląda

#include "resource.h" 
#include "version.h" 
... 
VS_VERSION_INFO VERSIONINFO 
FILEVERSION VER_FILE_VERSION 
... 

Więc moim problemem jest to, że za każdym razem dodaję zasób taki, że resource.h jest modyfikowany, Visual Studio 2015 wydaje się usunąć #include „wersję. h "w pliku .rc, a zamiast tego twarde koduje wszystkie wartości znalezione w" version.h ". Plik

przykład .RC problemu

#include "resource.h" 
... 
VS_VERSION_INFO VERSIONINFO 
FILEVERSION 3,0,0,2 
... 

Więc moje pytanie brzmi, jak mogę przestać VS2015 z tej operacji?

Odpowiedz

3

Nie można faktycznie zatrzymać wbudowanego edytora zasobów Visual Studio od tego. Za każdym razem, gdy korzystasz z edytora zasobów (, tj., GUI), aby dokonać zmian w elemencie w pliku zasobów, zostanie zregenerowany kod pliku zasobu. Spowoduje to oderwanie wszelkiego rodzaju ręcznych poprawek wprowadzonych do pliku zasobów, w tym zastąpienie stałych symbolicznych i/lub arytmetycznych literałami, usunięcie warunkowo zdefiniowanych bloków kodu, zniszczenie starannego ręcznego formatowania i tak dalej. W związku z tym nie jest dobrym pomysłem ręczna edycja pliku zasobów.

Jeśli musisz mieć możliwość ręcznego edytowania pliku zasobów, który edytor zasobów nie będzie zwalniał, możesz to osiągnąć, dodając do projektu drugi plik zasobów. Zgodnie z konwencją ma to rozszerzenie .rc2. Edytor zasobów Visual Studio nigdy nie będzie bezpośrednio edytować tych zasobów, co oznacza, że ​​cała edycja musi być wykonana ręcznie. Ale po prawidłowym skonfigurowaniu wszystkie zasoby, które tam umieścisz, będą nadal połączone w plik binarny, dzięki czemu wynik końcowy będzie równoważny.

To jest jedyny sposób na uzyskanie rozsądnej wersji i używam go w moich własnych projektach. Na przykład:

// 
// MyProj.RC2 - resources Microsoft Visual C++ does not edit directly 
// 

#ifdef APSTUDIO_INVOKED 
    #error this file is not editable by Microsoft Visual C++ 
#endif // APSTUDIO_INVOKED 


///////////////////////////////////////////////////////////////////////////// 
// 
// Version 
// 

#include "Version.h" 


VS_VERSION_INFO VERSIONINFO 
FILEVERSION  VERSION_MYPROJ_MAJOR,VERSION_MYPROJ_MINOR,VERSION_MYPROJ_REVISION,0 
PRODUCTVERSION VERSION_MYPROJ_MAJOR,VERSION_MYPROJ_MINOR,VERSION_MYPROJ_REVISION,0 
FILEFLAGSMASK 0x3fL 
#ifdef _DEBUG 
FILEFLAGS 0x1L 
#else 
FILEFLAGS 0x0L 
#endif 
FILEOS 0x40004L 
FILETYPE 0x1L 
FILESUBTYPE 0x0L 
BEGIN 
    BLOCK "StringFileInfo" 
    BEGIN 
     BLOCK "040904b0" 
     BEGIN 
      VALUE "CompanyName", "Cody Gray" 
      VALUE "FileDescription", "The World's Greatest Application" 
      VALUE "FileVersion", VERSION_MYPROJ_FULL 
      VALUE "InternalName", "MyProj" 
      VALUE "LegalCopyright", "Copyrights are for suckers!" 
      VALUE "OriginalFilename", "MyProj.exe" 
      VALUE "ProductName", "MyProj" 
      VALUE "ProductVersion", VERSION_MYPROJ_FULL 
     END 
    END 
    BLOCK "VarFileInfo" 
    BEGIN 
     VALUE "Translation", 0x409, 1200 
    END 
END 

Tutaj możesz umieścić również inne zasoby. Na przykład w jednej aplikacji, nad którą teraz pracuję, mam zasób okna dialogowego, który chcę tylko połączyć z kompilacjami "debugowania" (służy on do konfiguracji wewnętrznych opcji związanych z debugowaniem). Próbowałem zawinąć definicję okna dialogowego za pomocą #ifdef DEBUG, ale edytor zasobów usunął cały blok za każdym razem, gdy był uruchamiany, więc nie było go. Zamiast tego przeniosłem definicję okna dialogowego do mojego pliku .rc2, zachowując go w opakowaniu #ifdef. Straciłem możliwość edytowania go za pomocą edytora zasobów, ale nie obchodzi mnie to tak bardzo, ponieważ mogę edytować go równie szybko ręcznie w rzadkim przypadku, gdy muszę wprowadzić zmiany. A przynajmniej nie jest automatycznie usuwany.

Ostatnim kluczem jest skompilowanie pliku .rc2 przez edytor zasobów i połączenie z plikiem binarnym. Aby to zrobić, musisz edytować główny plik zasobów (.rc), ale ta zmiana zostanie zachowana. Częścią, którą chcesz edytować, są zasoby TEXTINCLUDE.W moim pliku .rc, że sekcja wygląda mniej więcej tak:

///////////////////////////////////////////////////////////////////////////// 
// 
// TEXTINCLUDE 
// 

1 TEXTINCLUDE 
BEGIN 
    "Resource.h\0" 
END 

2 TEXTINCLUDE 
BEGIN 
    "#ifndef APSTUDIO_INVOKED\r\n" 
    "#include ""TargetVer.h""\r\n" 
    "#endif\r\n" 
    "#include ""AfxRes.h""\r\n" 
    "#include ""VerRsrc.h""\r\n" 
    "#include ""Version.h""\r\n" 
    "\0" 
END 

3 TEXTINCLUDE 
BEGIN 
    "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" 
    "LANGUAGE 9, 1\r\n" 
    "#include ""MyProj.rc2""  // non-Microsoft Visual C++ edited resources\r\n" 
    "#include ""AfxRes.rc""  // standard components\r\n" 
    "#endif\r\n" 
    "\0" 
END 

#endif // APSTUDIO_INVOKED 

Ważną częścią jest gdzie MyProj.rc2 jest #included w 3. odcinku TEXTINCLUDE. Każdy tekst tutaj jest zrzucana bezpośrednio do pliku zasobów, gdy kompilator zasobów działa, więc na koniec swojego pliku zasobów, zobaczysz znajome wyglądające sekcja generowane automatycznie, takie jak:

#ifndef APSTUDIO_INVOKED 
///////////////////////////////////////////////////////////////////////////// 
// 
// Generated from the TEXTINCLUDE 3 resource. 
// 
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) 
LANGUAGE 9, 1 
#include "MyProj.rc2"  // non-Microsoft Visual C++ edited resources 
#include "AfxRes.rc"  // standard components 
#endif 

///////////////////////////////////////////////////////////////////////////// 
#endif // not APSTUDIO_INVOKED 

nosi wspomnieć, w przypadku, gdy nie możesz wymyślić, jak połączyć te elementy z moich przykładów tutaj, szablon projektu MFC w Visual Studio ustawia to wszystko automatycznie, jak opisano w this technical note.

Powiązane problemy