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.