Udostępnij za pośrednictwem


TN035: używanie wielu plików zasobów i plików nagłówków w programie Visual C++

Uwaga

Następująca uwaga techniczna nie została zaktualizowana, ponieważ została po raz pierwszy uwzględniona w dokumentacji online. W związku z tym niektóre procedury i tematy mogą być nieaktualne lub nieprawidłowe. Aby uzyskać najnowsze informacje, zaleca się wyszukanie interesującego tematu w indeksie dokumentacji online.

W tej notatce opisano, jak edytor zasobów Visual C++ obsługuje wiele plików zasobów i plików nagłówków udostępnianych w jednym projekcie lub współużytkowanych w wielu projektach oraz jak można korzystać z tej obsługi. Ta uwaga zawiera odpowiedzi na następujące pytania:

  • Kiedy możesz podzielić projekt na wiele plików zasobów i/lub plików nagłówkowych oraz jak to zrobić

  • Jak udostępnić wspólny plik nagłówka .H między dwoma .RC plikami

  • Jak podzielić zasoby projektu na wiele .RC plików

  • Jak (i narzędzia) zarządzać zależnościami kompilacji między plikami .RC, .CPPi .H

Należy pamiętać, że jeśli dodasz dodatkowy plik zasobów do projektu, klasa ClassWizard nie rozpozna zasobów w dodanym pliku.

Ta uwaga ma strukturę, aby odpowiedzieć na powyższe pytania w następujący sposób:

  • Omówienie sposobu, w jaki program Visual C++ zarządza plikami zasobów i plikami nagłówków, zawiera omówienie sposobu używania wielu plików zasobów i plików nagłówkowych w tym samym projekcie za pomocą polecenia Zestaw zasobów w języku Visual C++.

  • Analiza utworzonych .RC aplikacji AppWizard i .H plików analizuje wiele plików zasobów i nagłówków, które są używane przez aplikację utworzoną przez aplikację AppWizard. Te pliki służą jako dobry model dla dodatkowych plików zasobów i plików nagłówkowych, które warto dodać do projektu.

  • W tym dodatkowe pliki nagłówkowe opisuje miejsce, w którym można dołączyć wiele plików nagłówków, i zawiera szczegółowe informacje na temat tego, jak to zrobić.

  • Udostępnianie pliku nagłówka między dwoma .RC plikami pokazuje, jak można udostępnić jeden plik nagłówkowy między wieloma .RC plikami w różnych projektach, a może w tym samym projekcie.

  • Użycie wielu plików zasobów w tym samym projekcie opisuje, gdzie można podzielić projekt na wiele .RC plików i zawiera szczegółowe informacje na temat tego, jak to zrobić.

  • Wymuszanie plików Visual C++ niezmodyfikowalnych opisuje sposób, w jaki można upewnić się, że język Visual C++ nie edytuje i przypadkowo ponownie sformatował zasób niestandardowy.

  • Zarządzanie symbolami współużytkowanymi przez wiele plików edytowanych .RC w języku Visual C++ opisuje sposób udostępniania tych samych symboli w wielu .RC plikach i jak uniknąć przypisywania zduplikowanych wartości liczbowych identyfikatorów.

  • Zarządzanie zależnościami między plikami .RC , .CPPi .H opisuje sposób, w jaki program Visual C++ unika niepotrzebnego ponownego komplikowania .CPP plików, które są zależne od plików symboli zasobów.

  • Jak program Visual C++ zarządza zestawem zawiera informacje techniczne na temat sposobu, w jaki program Visual C++ śledzi wiele (zagnieżdżonych) .RC plików i wiele plików nagłówkowych uwzględnionych w .RC pliku.

Omówienie sposobu zarządzania plikami zasobów i plikami nagłówków w języku Visual C++

Program Visual C++ zarządza pojedynczym .RC plikiem zasobów i odpowiadającym mu .H plikiem nagłówkowym jako ściśle połączoną parą plików. Podczas edytowania i zapisywania .RC zasobów w pliku można pośrednio edytować i zapisywać symbole w odpowiednim .H pliku. Chociaż jednocześnie można otwierać i edytować wiele .RC plików (przy użyciu interfejsu użytkownika MDI języka Visual C++), dla dowolnego .RC pliku, który pośrednio edytujesz dokładnie jeden odpowiadający mu plik nagłówkowy.

Okno dialogowe Zasób widoku zasobu zawiera

Aby uzyskać dostęp do zasobu dołączanego, otwórz widok zasobów, a następnie kliknij prawym przyciskiem myszy .RC plik i wybierz pozycję Zasób obejmuje.

Plik nagłówka symboli

Domyślnie program Visual C++ zawsze nazywa odpowiedni plik RESOURCE.Hnagłówka , niezależnie od nazwy pliku zasobu (na przykład MYAPP.RC). Sekcja Plik nagłówka symboli: w oknie dialogowym Resource Includes w programie Visual C++, umożliwia zmianę nazwy tego pliku nagłówka. Wprowadź nową nazwę pliku w polu edycji sekcji.

Uwaga

pliki zasobów, które nie znajdują się w tym samym katalogu, co .RC plik, muszą poprzedzać ścieżkę względną z wartością escaped-"\" w celu poprawnego odczytania.

Dyrektywy symboli tylko do odczytu

Mimo że program Visual C++ edytuje tylko jeden plik nagłówkowy dla danego .RC pliku, program Visual C++ obsługuje odwołania do symboli zdefiniowanych w dodatkowych plikach nagłówków tylko do odczytu. Dyrektywy symboli tylko do odczytu: w oknie dialogowym Zasób dołączanie umożliwia określenie dowolnej liczby dodatkowych plików nagłówków tylko do odczytu jako dyrektywy symboli tylko do odczytu. Ograniczenie "tylko do odczytu" oznacza, że po dodaniu nowego zasobu w .RC pliku można użyć symbolu zdefiniowanego w pliku nagłówka tylko do odczytu. Jeśli jednak usuniesz zasób, symbol nadal pozostaje zdefiniowany w pliku nagłówka tylko do odczytu. Nie można zmienić wartości liczbowej przypisanej do symbolu tylko do odczytu.

Dyrektywy czasu kompilacji

Język Visual C++ obsługuje również zagnieżdżanie plików zasobów, w których jeden .RC plik znajduje się w innym przy użyciu #include dyrektywy . Podczas edytowania danego .RC pliku przy użyciu języka Visual C++wszystkie zasoby w dołączonych plikach nie są widoczne. Jednak podczas kompilowania .RC pliku dołączone pliki również są kompilowane. W sekcji Dyrektywy czasu kompilacji: w oknie dialogowym Zasoby zawiera można określić dowolną liczbę .RC plików do uwzględnienia jako dyrektywy czasu kompilacji.

Zwróć uwagę, co się stanie w przypadku odczytu do programu Visual C++ pliku zawierającego .RC inny .RC plik, który nie jest* określony jako dyrektywa w czasie kompilacji. Taka sytuacja może wystąpić, gdy przełączysz do programu Visual C++ .RC plik, który wcześniej był utrzymywany ręcznie za pomocą edytora tekstów. Gdy program Visual C++ odczytuje dołączony .RC plik, scala dołączone zasoby z plikiem nadrzędnym .RC . Po zapisaniu pliku #include nadrzędnego .RC instrukcja zostanie zastąpiona przez dołączone zasoby. Jeśli nie chcesz, aby to scalanie miało miejsce, przed odczytaniem instrukcji w pliku nadrzędnym należy usunąć #include ją z pliku nadrzędnego .RC w języku Visual C++, a następnie użyć języka Visual C++, dodać tę samą #include instrukcję co dyrektywa kompilatora czasu.

Visual C++ zapisuje w .RC pliku trzy rodzaje powyższych zestawów Zawiera informacje (plik nagłówka symboli, dyrektywy symboli tylko do odczytu i dyrektywy czasu kompilacji) w #include dyrektywach i zasobach TEXTINCLUDE . Zasoby TEXTINCLUDE , szczegóły implementacji, z którymi zwykle nie trzeba sobie poradzić, są objaśnione w temacie Jak zestaw zarządzania programem Visual C++ zawiera informacje.

Analiza plików utworzonych przez .RC aplikację AppWizard i .H

Badanie kodu aplikacji utworzonego przez aplikację AppWizard zapewnia wgląd w sposób, w jaki program Visual C++ zarządza wieloma plikami zasobów i plikami nagłówkowymi. Fragmenty kodu, które zostały zbadane poniżej, pochodzą z aplikacji utworzonej przez aplikację MYAPP AppWizard przy użyciu opcji domyślnych.

Aplikacja utworzona przez aplikację AppWizard używa wielu plików zasobów i wielu plików nagłówkowych, jak podsumowano na poniższym diagramie:

   RESOURCE.H     AFXRES.H
          \       /
           \     /
          MYAPP.RC
              |
              |
        RES\MYAPP.RC2
        AFXRES.RC
        AFXPRINT.RC

Te wiele relacji plików można wyświetlić przy użyciu polecenia Plik/Zestaw języka Visual C++.

MYAPP.RC
Plik zasobu aplikacji edytowany przy użyciu języka Visual C++.

RESOURCE.H jest plikiem nagłówka specyficznym dla aplikacji. Jest ona zawsze nazwana RESOURCE.H przez aplikację AppWizard, zgodną z domyślnym nazewnictwem pliku nagłówka języka Visual C++. Dla #include tego pliku nagłówka jest pierwszą instrukcją w pliku zasobu (MYAPP.RC):

//Microsoft Visual C++ generated resource script
//
#include "resource.h"

RES\MYAPP.RC2
Zawiera zasoby, które nie zostaną edytowane przez program Visual C++, ale zostaną uwzględnione w końcowym skompilowanym .EXE pliku. Aplikacja AppWizard domyślnie nie tworzy takich zasobów, ponieważ program Visual C++ może edytować wszystkie standardowe zasoby, w tym zasób wersji (nowa funkcja w tej wersji). Pusty plik jest generowany przez aplikację AppWizard na wypadek, gdy chcesz dodać własne niestandardowe sformatowane zasoby do tego pliku.

Jeśli używasz niestandardowych zasobów sformatowanych, możesz je RES\MYAPP.RC2 dodać i edytować za pomocą edytora tekstów Visual C++.

AFXRES.RC zawierają AFXPRINT.RC standardowe zasoby wymagane przez niektóre funkcje platformy. Podobnie jak RES\MYAPP.RC2, te dwa pliki zasobów dostarczone przez platformę są uwzględniane na końcu MYAPP.RCelementu i są one określone w dyrektywach czasu kompilacji okna dialogowego Zestaw dołączania. W związku z tym nie można bezpośrednio wyświetlać ani edytować tych zasobów platformy podczas edytowania MYAPP.RC w języku Visual C++, ale są one kompilowane w pliku binarnym .RES i końcowym .EXE pliku aplikacji. Aby uzyskać więcej informacji na temat standardowych zasobów platformowych, w tym procedur ich modyfikowania, zobacz Technical Note 23 (Uwaga techniczna 23).

AFXRES.H definiuje standardowe symbole, takie jak ID_FILE_NEW, używane przez platformę i używane specjalnie w programie AFXRES.RC. AFXRES.H Używa #include również funkcji , WINRES.Hktóra zawiera podzbiór WINDOWS.H elementów wymaganych przez pliki wygenerowane .RC przez program Visual C++ i AFXRES.RC. Symbole zdefiniowane w pliku AFXRES.H są dostępne podczas edytowania pliku zasobu aplikacji (MYAPP.RC). Na przykład ID_FILE_NEW jest używany dla FileNew elementu menu w zasobie MYAPP.RC menu pliku. Nie można zmienić ani usunąć tych symboli zdefiniowanych przez platformę.

Dołączanie dodatkowych plików nagłówków

Aplikacja utworzona przez aplikację AppWizard zawiera tylko dwa pliki nagłówkowe: RESOURCE.H i AFXRES.H. Tylko RESOURCE.H dotyczy aplikacji. W następujących przypadkach może być konieczne dołączenie dodatkowych plików nagłówków tylko do odczytu:

Plik nagłówka jest dostarczany przez źródło zewnętrzne lub chcesz udostępnić plik nagłówka między wieloma projektami lub wieloma częściami tego samego projektu.

Plik nagłówkowy ma formatowanie i komentarze, których nie chcesz, aby program Visual C++ zmienił się lub odfiltrował podczas zapisywania pliku. Na przykład możesz zachować #define, które używają arytmetyki symbolicznej, takiej jak:

#define RED 0
#define BLUE 1
#define GREEN 2
#define ID_COLOR_BUTTON 1001
#define ID_RED_BUTTON (ID_COLOR_BUTTON + RED)
#define ID_BLUE_BUTTON (ID_COLOR_BUTTON + BLUE)
#define ID_GREEN_BUTTON (ID_COLOR_BUTTON + GREEN)

Dodatkowe pliki nagłówków tylko do odczytu można uwzględnić za pomocą polecenia Resource Include , aby określić instrukcję #include jako drugą dyrektywę symboli tylko do odczytu, jak w temacie:

#include "afxres.h"
#include "second.h"

Nowy diagram relacji plików wygląda teraz następująco:

                   AFXRES.H
    RESOURCE.H     SECOND.H
          \       /
           \     /
          MYAPP.RC
              |
              |
        RES\MYAPP.RC2  
        AFXRES.RC
        AFXPRINT.RC

Udostępnianie pliku nagłówka między dwoma .RC plikami

Możesz udostępnić plik nagłówka między dwoma .RC plikami, które znajdują się w różnych projektach, lub prawdopodobnie w tym samym projekcie. W tym celu zastosuj technikę dyrektywy tylko do odczytu opisaną powyżej w obu .RC plikach. W przypadku, gdy dwa .RC pliki są przeznaczone dla różnych aplikacji (różnych projektów), wynik jest przedstawiony na poniższym diagramie:

     RESOURCE.H   AFXRES.H   RESOURCE.H  
    (for MYAPP1)  SECOND.H   (for MYAPP2)
          \       /     \       /
           \     /       \     /
          MYAPP1.RC      MYAPP2.RC
           /    \        /     \
          /      \      /       \
RES\MYAPP1.RC2  AFXRES.RC     RES\MYAPP2.RC2
                AFXPRINT.RC

W przypadku, gdy drugi plik nagłówka jest współużytkowany przez dwa .RC pliki w tej samej aplikacji (projekt) jest omówiony poniżej.

Używanie wielu plików zasobów w tym samym projekcie

Visual C++ i kompilator zasobów obsługują wiele .RC plików w tym samym projekcie za pomocą #include dyrektyw, które zawierają jeden .RC plik w innym. Dozwolone jest wiele zagnieżdżania. Istnieją różne powody dzielenia zasobów projektu na wiele .RC plików:

  • Łatwiej jest zarządzać dużą liczbą zasobów wśród wielu członków zespołu projektu, jeśli podzielisz zasoby na wiele .RC plików. Jeśli używasz pakietu zarządzania kontrolą źródła do wyewidencjonowania plików i ewidencjonowania zmian, podzielenie zasobów na wiele .RC plików zapewni dokładną kontrolę nad zarządzaniem zmianami w zasobach.

  • Jeśli chcesz użyć dyrektyw preprocesora, takich jak #ifdef, #endifi #define, dla części zasobów, musisz odizolować je w zasobach tylko do odczytu, które zostaną skompilowane przez kompilator zasobów.

  • Pliki składników .RC będą ładować i zapisywać szybciej w programie Visual C++ niż jeden plik złożony .RC .

  • Jeśli chcesz zachować zasób za pomocą edytora tekstów w postaci czytelnej dla człowieka, należy zachować go w pliku oddzielnym od tych, które można edytować w .RC języku Visual C++.

  • Jeśli musisz zachować zasób zdefiniowany przez użytkownika w postaci binarnej lub tekstowej, którą można interpretować przez inny wyspecjalizowany edytor danych, należy zachować go w osobnym .RC pliku, aby program Visual C++ nie zmieniał formatu na dane szesnastkowe. Zasoby .WAV pliku (dźwięku) w przykładzie MFC Advanced Concepts SPEAKN są dobrym przykładem.

Dyrektywy kompilowania czasu można uwzględnić SECOND.RC w oknie dialogowym Zestaw dołączania:

#include "res\myapp.rc2"  // non-Visual C++ edited resources
#include "second.rc"  // THE SECOND .RC FILE

#include "afxres.rc"  // Standard components
#include "afxprint.rc"  // printing/print preview resources

Wynik przedstawiono na poniższym diagramie:

   RESOURCE.H     AFXRES.H
          \       /
           \     /
          MYAPP.RC
              |
              |
        RES\MYAPP.RC2
        SECOND.RC  
        AFXRES.RC
        AFXPRINT.RC

Za pomocą dyrektyw w czasie kompilacji można organizować zasoby edytowalne i niezmodalne w języku Visual C++ w wielu .RC plikach, gdzie główny MYAPP.RC nie wykonuje żadnych czynności, ale #include innych .RC plików. Jeśli używasz pliku projektu .MAK visual Studio C++, w projekcie powinien zostać uwzględniony główny .RC plik, aby wszystkie dołączone zasoby były kompilowane z aplikacją.

Wymuszanie plików Visual C++ nie edytowalnych

Plik utworzony przez RES\MYAPP.RC2 aplikację AppWizard jest przykładem pliku zawierającego zasoby, których nie chcesz przypadkowo odczytywać w języku Visual C++, a następnie zapisywać z powrotem z utratą informacji o formatowaniu. Aby chronić przed tym problemem, umieść następujące wiersze na początku RES\MYAPP.RC2 pliku:

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

Gdy program Visual C++ skompiluje .RC plik, definiuje zarówno plik , jak APSTUDIO_INVOKED i RC_INVOKED. Jeśli struktura plików utworzona przez aplikację AppWizard jest uszkodzona, a program Visual C++ odczytuje wiersz #error powyżej, zgłasza błąd krytyczny i przerywa odczyt .RC pliku.

Zarządzanie symbolami współużytkowanych przez wiele plików edytowanych w języku .RC Visual C++

Podczas dzielenia zasobów na wiele .RC plików, które chcesz edytować oddzielnie w programie Visual C++, pojawiają się dwa problemy:

  • Możesz chcieć udostępnić te same symbole w wielu .RC plikach.

  • Musisz pomóc visual C++ uniknąć przypisywania tych samych wartości liczbowych identyfikatorów do odrębnych zasobów (symboli).

Na poniższym diagramie przedstawiono organizację .RC plików i .H , które dotyczą pierwszego problemu:

              MYAPP.RC
             /         \
            /           \
MYSTRS.H   / MYSHARED.H  \  MYMENUS.H
     \    /    /      \   \    \
      \  /    /        \   \    \
      MYSTRS.RC         MYMENUS.RC

W tym przykładzie zasoby ciągów są przechowywane w jednym pliku zasobów, MYSTRS.RCa menu są przechowywane w innym. MYMENUS.RC Niektóre symbole, takie jak w przypadku poleceń, mogą być współużytkowane między dwoma plikami. Może to być na przykład ID_TOOLS_SPELL identyfikator polecenia menu dla elementu Spell w menu Narzędzia. Może to być również identyfikator ciągu wiersza polecenia wyświetlany przez strukturę na pasku stanu okna głównego aplikacji.

Symbol ID_TOOLS_SPELL jest przechowywany w udostępnionym pliku nagłówka . MYSHARED.H Ten udostępniony plik nagłówka jest utrzymywany ręcznie za pomocą edytora tekstów; Język Visual C++ nie edytuje go bezpośrednio. W dwóch plikach MYSTRS.RC zasobów i MYMENUS.RC, należy określić #include "MYSHARED.H" w dyrektywach tylko do odczytu dla MYAPP.RC, używając polecenia Resource Includes , zgodnie z wcześniejszym opisem.

Najwygodniejsze jest przewidywanie symbolu, który zostanie udostępniony przed podjęciem próby użycia go w celu zidentyfikowania dowolnego zasobu. Dodaj symbol do udostępnionego pliku nagłówka i, jeśli nie dołączono jeszcze udostępnionego pliku nagłówka w dyrektywach tylko do odczytu dla .RC pliku, przed użyciem symbolu. Jeśli nie przewidujesz udostępniania symbolu w ten sposób, musisz ręcznie (przy użyciu edytora tekstów) przenieść instrukcję #define dla symbolu , powiedzmy, MYMENUS.H do MYSHARED.H wcześniejszego użycia w MYSTRS.RCpliku .

W przypadku zarządzania symbolami w wielu .RC plikach należy również pomóc programowi Visual C++ uniknąć przypisywania tych samych wartości liczbowych identyfikatorów do odrębnych zasobów (symboli). W przypadku dowolnego .RC pliku program Visual C++ przyrostowo przypisuje identyfikatory w każdej z czterech domen identyfikatorów. Między edytowaniem sesji program Visual C++ śledzi ostatni identyfikator przypisany do każdej z domen w pliku nagłówka symboli .RC dla pliku. APS_NEXT Poniżej przedstawiono wartości dla pustego (nowego) .RC pliku:

#define _APS_NEXT_RESOURCE_VALUE  101
#define _APS_NEXT_COMMAND_VALUE   40001
#define _APS_NEXT_CONTROL_VALUE   1000
#define _APS_NEXT_SYMED_VALUE     101

_APS_NEXT_RESOURCE_VALUE to następna wartość symbolu, która będzie używana dla zasobu okna dialogowego, zasobu menu itd. Prawidłowy zakres wartości symboli zasobu to 1 do 0x6FFF.

_APS_NEXT_COMMAND_VALUE to następna wartość symbolu, która będzie używana do identyfikacji poleceń. Prawidłowy zakres wartości symboli polecenia jest 0x8000 0xDFFF.

_APS_NEXT_CONTROL_VALUE to następna wartość symbolu, która będzie używana dla kontrolki okna dialogowego. Prawidłowy zakres wartości symboli kontrolki okna dialogowego to 8 do 0xDFFF.

_APS_NEXT_SYMED_VALUE to następna wartość symbolu, która zostanie wystawiona podczas ręcznego przypisywania wartości symboli przy użyciu polecenia Nowy w przeglądarce symboli.

Język Visual C++ zaczyna się od nieco wyższych wartości, które są najmniejszą wartością prawną podczas tworzenia nowego .RC pliku. Aplikacja AppWizard zainicjuje również te wartości do czegoś bardziej odpowiedniego dla aplikacji MFC. Aby uzyskać więcej informacji na temat zakresów wartości identyfikatorów, zobacz Technical Note 20 (Uwaga techniczna 20).

Teraz za każdym razem, gdy tworzysz nowy plik zasobów, nawet w tym samym projekcie, program Visual C++ definiuje te same _APS_NEXT_ wartości. Oznacza to, że w przypadku dodania wielu okien dialogowych w dwóch różnych .RC plikach istnieje duże prawdopodobieństwo, że ta sama wartość #define zostanie przypisana do różnych okien dialogowych. Na przykład IDD_MY_DLG1 w pierwszym .RC pliku można przypisać tę samą liczbę 101, co IDD_MY_DLG2 w drugim .RC pliku.

Aby uniknąć tego problemu, należy zarezerwować oddzielny zakres liczbowy dla każdej z czterech domen identyfikatorów w odpowiednich .RC plikach. Ustaw zakresy, ręcznie aktualizując _APS_NEXT wartości w każdym z .RC plików przed rozpoczęciem dodawania zasobów. Jeśli na przykład pierwszy .RC plik używa wartości domyślnych _APS_NEXT , możesz przypisać następujące _APS_NEXT wartości do drugiego .RC pliku:

#define _APS_NEXT_RESOURCE_VALUE  2000
#define _APS_NEXT_COMMAND_VALUE   42000
#define _APS_NEXT_CONTROL_VALUE   2000
#define _APS_NEXT_SYMED_VALUE     2000

Oczywiście nadal istnieje możliwość, że program Visual C++ przypisze tak wiele identyfikatorów w pierwszym .RC pliku, że wartości liczbowe zaczynają nakładać się na te zarezerwowane dla drugiego .RC pliku. Należy zarezerwować wystarczająco duże zakresy, aby ta kolizja się nie wydarzyła.

Zarządzanie zależnościami między plikami .RC, .CPPi .H

Gdy program Visual C++ zapisuje .RC plik, zapisuje również zmiany symboli w odpowiednim RESOURCE.H pliku. .CPP Wszystkie pliki odwołujące się do zasobów w .RC pliku muszą być używane #include do uwzględnienia RESOURCE.H pliku, zwykle z głównego pliku nagłówka projektu. Włączenie to prowadzi do niepożądanego działania niepożądanego ze względu na wewnętrzne zarządzanie projektami środowiska deweloperskiego, które skanuje pliki źródłowe pod kątem zależności nagłówka. Za każdym razem, gdy dodasz nowy symbol w programie Visual C++, wszystkie .CPP pliki, które mają #include "RESOURCE.H" dyrektywy, muszą zostać ponownie skompilowane.

Visual C++, pomija zależność od RESOURCE.H , dołączając następujący komentarz jako pierwszy wiersz RESOURCE.H pliku:

//{{NO_DEPENDENCIES}}

Środowisko programistyczne interpretuje ten komentarz, ignorując zmiany, RESOURCE.H aby pliki zależne .CPP nie musiały zostać ponownie skompilowane.

Program Visual C++ zawsze dodaje wiersz komentarza //{{NO_DEPENDENCIES}} do .RC pliku podczas zapisywania pliku. W niektórych przypadkach obejście zależności kompilacji od RESOURCE.H może prowadzić do błędów czasu wykonywania niewykrytych w czasie połączenia. Jeśli na przykład użyjesz przeglądarki symboli, aby zmienić wartość liczbową przypisaną do symbolu zasobu, zasób nie zostanie poprawnie znaleziony i załadowany w czasie wykonywania aplikacji, jeśli .CPP plik odwołujący się do zasobu nie zostanie ponownie skompilowany. W takich przypadkach należy jawnie ponownie skompilować wszystkie .CPP pliki, na które wiadomo, że mają wpływ zmiany symboli w RESOURCE.H pliku lub wybierz pozycję Odbuduj wszystko. Jeśli istnieje konieczność częstego zmieniania wartości symboli dla określonej grupy zasobów, prawdopodobnie bardziej wygodne i bezpieczniejsze jest podzielenie tych symboli na oddzielny plik nagłówka tylko do odczytu, zgodnie z opisem w powyższej sekcji Dołączanie dodatkowych plików nagłówkowych.

Jak program Visual C++ zarządza zestawem zawiera informacje

Zgodnie z powyższym opisem w menu Plik Set Includes polecenie umożliwia określenie trzech typów informacji:

  • Plik nagłówka symboli

  • Dyrektywy symboli tylko do odczytu

  • Dyrektywy czasu kompilacji

W poniższej tabeli opisano sposób obsługi tych informacji w pliku w .RC języku Visual C++. Nie potrzebujesz tych informacji, aby używać języka Visual C++, ale może to zwiększyć zrozumienie, aby można było bezpieczniej użyć funkcji Ustaw dołączanie.

Każdy z powyższych trzech typów zestawu zawiera informacje są przechowywane w .RC pliku w dwóch formach: (1) jako #include lub inne dyrektywy interpretowane przez kompilator zasobów, i (2) jako specjalne TEXTINCLUDE zasoby interpretowane tylko przez visual C++.

Celem TEXTINCLUDE zasobu jest bezpieczne przechowywanie informacji o zestawie dołączania w formularzu, który można łatwo przedstawić w oknie dialogowym Zestaw dołączania języka Visual C++. TEXTINCLUDEjest typem zasobu zdefiniowanym przez program Visual C++. Program Visual C++ rozpoznaje trzy określone TEXTINCLUDE zasoby, które mają numery identyfikacyjne zasobów 1, 2 i 3:

TEXTINCLUDE identyfikator zasobu Typ zestawu zawiera informacje
1 Plik nagłówka symboli
2 Dyrektywy symboli tylko do odczytu
3 Dyrektywy czasu kompilacji

Każdy z trzech typów zestawu zawiera informacje są ilustrowane domyślnie MYAPP.RC i RESOURCE.H pliki utworzone przez AppWizard, jak opisano poniżej. Dodatkowe \0"" i tokeny między blokami BEGIN i END są wymagane przez składnię RC, aby określić zero zakończonych ciągów i znak podwójnego cudzysłowu odpowiednio.

Plik nagłówka symboli

Formularz informacji o pliku nagłówka symboli interpretowany przez kompilator zasobów jest po prostu instrukcją #include :

#include "resource.h"

Odpowiedni TEXTINCLUDE zasób to:

1 TEXTINCLUDE DISCARDABLE
BEGIN
    "resource.h\0"
END

Dyrektywy symboli tylko do odczytu

Dyrektywy symboli tylko do odczytu są zawarte w górnej części MYAPP.RC następującej formy interpretowanej przez kompilator zasobów:

#include "afxres.h"

Odpowiedni TEXTINCLUDE zasób to:

2 TEXTINCLUDE DISCARDABLE
BEGIN
   "#include ""afxres.h""\r\n"
   "\0"
END

Dyrektywy czasu kompilacji

Dyrektywy czasu kompilacji są uwzględniane na końcu MYAPP.RC następującej formy interpretowanej przez kompilator zasobów:

#ifndef APSTUDIO_INVOKED
///////////////////////
//
// From TEXTINCLUDE 3
//
#include "res\myapp.rc2"  // non-Visual C++ edited resources

#include "afxres.rc"  // Standard components
#include "afxprint.rc"  // printing/print preview resources
#endif  // not APSTUDIO_INVOKED

Dyrektywa #ifndef APSTUDIO_INVOKED instruuje program Visual C++, aby pominąć dyrektywy kompilowania w czasie kompilacji.

Odpowiedni TEXTINCLUDE zasób to:

3 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""res\myapp.rc2""  // non-Visual C++ edited resources\r\n"
"\r\n"
"#include ""afxres.rc""  // Standard components\r\n"
"#include ""afxprint.rc""  // printing/print preview resources\r\n"
"\0"
END

Zobacz też

Uwagi techniczne według numerów
Uwagi techniczne według kategorii