TN035: Uso de múltiples archivos de recursos y archivos de encabezado con Visual C++

Esta nota describe cómo el editor de recursos de Visual C++ admite múltiples archivos de recursos y archivos de encabezado compartidos en un único proyectan o compartieron a través de múltiples proyectos y cómo pueden aprovechar de ese apoyo. Esta nota responde a estas preguntas:

Debe tener en cuenta que si agrega un archivo de recursos adicionales al proyecto, ClassWizard no reconocerá los recursos en el archivo agregado.

Esta nota está estructurada para responder a las preguntas anteriores como sigue:

Visión general de cómo Visual C++ administra archivos de recursos y archivos de encabezado

Visual C++ administra una sola.Archivo de recursos RC y una correspondiente.Archivo de encabezado de h como un par de archivos totalmente acoplado. Cuando se edita y ahorrar recursos en una.Archivo RC, indirectamente modificar y guardar símbolos en el correspondiente.Archivo H. Aunque puede abrir y editar múltiples.Archivos de RC en un momento (mediante la interfaz de usuario de Visual C++ MDI) para cualquier.Archivo RC indirectamente edita exactamente un archivo de encabezado correspondiente.

Archivo de encabezado de símbolos

De forma predeterminada, Visual C++ siempre nombres de archivo de encabezado correspondiente recurso.H, independientemente del nombre del archivo de recursos (por ejemplo, MYAPP.RC). Mediante el comando Set incluye archivos en Visual C++, puede cambiar el nombre de este archivo de encabezado por actualizar el archivo de encabezado de símbolo en el cuadro de diálogo Definir incluye.

Directivas de símbolo de sólo lectura

Aunque Visual C++ sólo edita un archivo de encabezado para cualquier.Archivo RC, Visual C++ admite referencias a símbolos definidos en los archivos de encabezado adicional de sólo lectura. Mediante el comando Set incluye archivos en Visual C++, puede especificar cualquier número de archivos de encabezado adicional de sólo lectura como directivas de símbolo de sólo lectura. La restricción de "sólo lectura" significa que cuando se agrega un nuevo recurso en el.Archivo RC, puede utilizar un símbolo definido en el archivo de encabezado de sólo lectura; pero si se elimina el recurso, el símbolo sigue siendo definido en el archivo de encabezado de sólo lectura. No se puede cambiar el valor numérico asignado a un símbolo de sólo lectura.

Directivas de compilación

Visual C++ admite también el anidamiento de archivos de recursos, donde uno.Archivo RC es # include'd dentro de otra. Cuando edita un determinado.Archivo RC utilizando Visual C++, los recursos de los archivos de # include'd no son visibles. Pero cuando se compila el.Archivo RC, también se compilan los archivos # include'd. Mediante el comando Set incluye archivos en Visual C++, se puede especificar cualquier número de # include'd.Archivos RC como directivas de compilación.

Tenga en cuenta lo que sucede si lees en Visual C++ una.Otro del archivo RC que # include.RC es archivo no especificado como una directiva de tiempo de compilación. Esta situación podría surgir cuando traen a Visual C++ una.Archivo RC que había sido previamente mantener manualmente con un editor de texto. Cuando Visual C++ Lee la # include'd.Archivo RC, combina los recursos de # include'd en el padre.Archivo RC. Al guardar el elemento primario.Archivo RC, instrucción, el # include en efecto, será reemplazado por los recursos de # include'd. Si no desea que esta combinación ocurra, debe quitar la # incluir declaración del padre.Archivo RC previo a la lectura en Visual C++; utilizando Visual C++, añadir back la misma instrucción como una directiva de tiempo de compilación # include.

Visual C++ se guarda en una.Los tres tipos de archivo RC de arriba conjunto incluye información (archivo de encabezado de símbolos, las directivas de símbolo de sólo lectura y directivas de compilación) en # incluyen directivas y recursos TEXTINCLUDE. Los recursos TEXTINCLUDE, un detalle de implementación que normalmente no es necesario tratar, se explican en Forma Visual C++ administra establecer incluye información.

Análisis de AppWizard creado.RC y.H archivos

Examinar el código de aplicación producido por AppWizard proporciona información sobre cómo Visual C++ administra múltiples archivos de recursos y archivos de encabezado. Los fragmentos de código examinados a continuación son de una aplicación MYAPP producida por AppWizard mediante las opciones predeterminadas.

Una aplicación creada por el Asistente para aplicaciones utiliza múltiples archivos de recursos y múltiples archivos de encabezado, como se resume en el siguiente diagrama:

nbsp;  RECURSO.H AFXRES.H                    
          \       /                              
           \     /                                
          MYAPP.RC                               
              |                                
              |                              
        RES\MYAPP.RC2 AFXRES.RC AFXPRINT.RC & nbsp
 

Puede ver estas múltiples relaciones de archivo mediante el comando archivo de Visual C++/conjunto incluye.

MYAPP.RC

El archivo de recursos de aplicación que edita utilizando Visual C++.

RECURSO.H es el archivo de encabezado de aplicaciones específicas. Siempre se denomina recurso.H por AppWizard, coherente con la forma predeterminada de Visual C++ nombrar el archivo de encabezado. El # include para este archivo de encabezado es la primera instrucción en el archivo de recursos (MYAPP.RC):

//Microsoft visual C++ generado script del recurso
//
# include "resource.h"

RES\MYAPP.RC2

Contiene recursos que no se editarán por Visual C++ pero se incluirá en la final compilada.Archivo EXE. AppWizard no crea esos recursos de manera predeterminada, ya que Visual C++ puede editar todos los recursos estándar, incluido el recurso de versión (como novedad en esta versión). AppWizard genera un archivo vacío en caso de que desee agregar sus propios recursos con formato personalizados para este archivo.

Si utiliza recursos con formato personalizados, se puede agregar a RES\MYAPP.RC2 y editarlos utilizando el editor de texto de Visual C++.

AFXRES.RC y AFXPRINT.RC contienen recursos estándar requeridos por ciertas características del marco. Como RES\MYAPP.RC2, estos dos archivos de recursos proporcionados por el marco son # include'd final MYAPP.RC y se especifican en las directivas de compilación del cuadro de diálogo Definir incluye. Por lo tanto, no directamente ver o editar estos recursos marco mientras edita MYAPP.RC en Visual C++, pero se compilan en binario de la aplicación.Archivo de RES y final.Archivo EXE. Para obtener más información sobre los recursos de marco estándar, incluidos los procedimientos para modificarlas, vea 23 de nota técnica.

AFXRES.H define símbolos estándar, tales como ID_FILE_NEW, utilizado por el marco y se utiliza específicamente en AFXRES.RC. AFXRES.H también # include de WINRES.H, que contiene un subconjunto de WINDOWS.H que se necesitan por Visual C++ generado.Archivos RC, así como AFXRES.RC. Los símbolos definidos en AFXRES.H están disponibles como editar el archivo de recursos de aplicación (MYAPP.RC). Por ejemplo, ID_FILE_NEW es utilizado para el elemento de menú nuevo archivo en MYAPP.Recurso de menú del RC. No se puede cambiar o eliminar estos símbolos definidos por el marco.

Incluir archivos adicionales de encabezado

La aplicación creada por el Asistente para aplicaciones incluye sólo dos archivos de encabezado: recursos.H y AFXRES.H. sólo recurso.H es específica de la aplicación. Puede que necesite incluir archivos de encabezado adicional de sólo lectura en los siguientes casos

El archivo de encabezado es proporcionado por una fuente externa, o desea compartir el archivo de encabezado entre varios proyectos o varias partes del mismo proyecto.

El archivo de encabezado tiene formato y comentarios que no desea que Visual C++ para cambiar o filtrar cuando guarda el archivo. Por ejemplo, quizá desee preservar # de definir que utilice aritmética simbólica como:

# define rojo 0
# define 1 azul
# define verde 2
# define ID_COLOR_BUTTON 1001
# define ID_RED_BUTTON (ID_COLOR_BUTTON + roja)
# define ID_BLUE_BUTTON (ID_COLOR_BUTTON + azul)
# define ID_GREEN_BUTTON (ID_COLOR_BUTTON + verde)

Puede incluir archivos de encabezado adicional de sólo lectura mediante el comando Set incluye archivo para especificar el # include declaración como una segunda Directiva de símbolo de sólo lectura, como en:

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

El nuevo diagrama de relación de archivo ahora este aspecto:

nbsp;                  AFXRES.H RECURSOS.H SEGUNDO.H                    
          \       /                              
           \     /                                
          MYAPP.RC   
              |                                
              |                              
        RES\MYAPP.RC2 AFXRES.RC AFXPRINT.RC & nbsp
 

Compartir un archivo de encabezado entre dos.Archivos RC

Puede que desee compartir un archivo de encabezado entre dos.RC archivos que están en diferentes proyectos, o posiblemente el mismo proyecto. Para ello, simplemente aplicar la técnica de las directivas de sólo lectura descrita a ambos.Archivos RC. En el caso donde los dos.Archivos RC son para diferentes aplicaciones (diferentes proyectos), en el siguiente diagrama se ilustra el resultado:

nbsp;    RECURSO.H AFXRES.H RECURSOS.H (MYAPP1) segundo.H   (for MYAPP2)             
          \       /     \       /           
           \     /       \     /             
          MYAPP1.RC MYAPP2.RC                 
           /    \        /     \                   
          /      \      /       \            
RES\MYAPP1.RC2 AFXRES.RC RES\MYAPP2.RC2 AFXPRINT.RC & nbsp
 

El caso donde el segundo archivo de encabezado es compartido por dos.Archivos de RC en la misma aplicación (proyecto) se examinan a continuación.

Uso de varios archivos de recursos en el mismo proyecto

Visual C++ y el compilador de recursos admiten múltiples.Archivos de RC en el mismo proyecto a través de # de incluir de uno.Archivo RC dentro de otra. Se permite anidar múltiples. Hay varias razones para dividir los recursos del proyecto en múltiples.Archivos RC:

Puede # incluyen un segundo.RC en las directivas de compilación en el cuadro de diálogo Definir incluye:

# i&nclude "res\myapp.rc2"nbsp; / / no Visual C++ editar recursos
# include "second.rc" / / el segundo.RC ARCHIVO

# include "afxres.rc" / / estándar componentes
# include "afxprint.rc" / / recursos de vista previa de impresión e impresión

En el siguiente diagrama se ilustra el resultado:

nbsp;  RECURSO.H AFXRES.H                    
          \       /                              
           \     /                                
          MYAPP.RC
              |                                
              |                              
        RES\MYAPP.RC2
        EN SEGUNDO LUGAR.RC AFXRES.RC AFXPRINT.RC & nbsp
 

Utilizar directivas de compilación, puede organizar sus recursos visuales C++ editables y no editables en múltiples.Archivos RC, donde el "maestro" MYAPP.RC no hace nada pero # include el otro.Archivos RC. Si está utilizando un proyecto de Visual C++.Archivo MAK, entonces usted debe incluir al "maestro".RC de archivo en el proyecto para que todos los recursos de # include'd se compilan con su aplicación.

Ejecución de archivos de Visual C++ no editables

El RES\MYAPP creado por el Asistente para aplicaciones.Archivo RC2 es un ejemplo de un archivo que contiene los recursos que usted no quiere leer accidentalmente en Visual C++ y, a continuación, escriba revertir con la pérdida de información de formato. Para protegerse contra esto, colocamos las siguientes líneas en el comienzo de la RES\MYAPP.Archivo de RC2:

# ifdef APSTUDIO_I&NVOKED
 nbsp;  # error este archivo no es editable por Visual C++
# endif //APSTUDIO_INVOKED

Cuando compila Visual C++ el.Archivo RC, define APSTUDIO_INVOKED como RC_INVOKED. Si está dañada la estructura del archivo creado AppWizard y Visual C++ Lee la línea # error anterior, informa de un error fatal y abortar la lectura de la.Archivo RC.

Administración de símbolos compartidos por múltiples Visual C++ editado.Archivos RC

Dos cuestiones surgen cuando separó de sus recursos en múltiples.Archivos RC que desea editar por separado en Visual C++:

El siguiente diagrama ilustra una organización.RC y.Archivos de h que trata de la primera edición:

nbsp;             MYAPP.RC
             /         \
            /           \
MYSTRS.H / MYSHARED.H \ MYME&NUS.H
     \    /    /      \   \    \
      \  /    /        \   \    \
   MYSTRS.RC MYMENUS.RC

En este ejemplo, recursos de cadena se guardan en el archivo de un recurso, MYSTRS.RC y menús se mantienen en otra, MYMENUS.RC. Algunos símbolos, tales como de comandos, pueden que deba ser compartida entre los dos archivos. Por ejemplo, un ID_TOOLS_SPELL puede ser el identificador de comando de menú para el elemento corrector en un menú de herramientas; y también puede ser el ID de cadena de la línea de comandos muestra el marco en la barra de estado de la ventana principal de la aplicación.

El símbolo ID_TOOLS_SPELL se conserva en el archivo de encabezado compartida, MYSHARED.H. usted mantener este archivo de encabezado compartido manualmente con un editor de texto; Visual C++ no directamente editarlo. En el recurso de dos archivos MYSTRS.RC y MYMENUS.RC, especifique # incluyen MYSHARED.H en las directivas de sólo lectura para MYAPP.RC, mediante el comando archivo conjunto incluye, como se describió anteriormente.

Es más conveniente anticipar un símbolo compartes antes de intentar usar para identificar cualquier recurso. Agregar el símbolo para el archivo de encabezado compartida y, si ya no tienes # include'd el archivo de encabezado compartida en las directivas de sólo lectura para el.RC archivo, hágalo antes de utilizar el símbolo. Si usted no se previó compartir el símbolo de esta manera, entonces tendrá que manualmente (mediante un editor de texto) mover instrucción para el símbolo, el # define decir, MYMENUS.H a MYSHARED.H antes de utilizarlo en MYSTRS.RC.

Cuando se logran símbolos en múltiples.Archivos RC, usted también debe evitar Visual C++ asignar el mismo ID de valores numéricos a distintos recursos (símbolos). Para cualquier.Archivo RC, Visual C++ incrementalmente asigna identificadores en cada uno de los cuatro dominios de ID. Entre las sesiones de edición, Visual C++ realiza un seguimiento del último identificador asignado en cada uno de los dominios en el archivo de encabezado de símbolo para el.Archivo RC. Aquí es lo que son los valores APS_NEXT para un vacío (nuevo).Archivo RC:

# define _APS_&NEXT_RESOURCE_VALUEnbsp; 00 P
# define _APS_NEXT_COMMAND_VALUE 40001
# define _APS_NEXT_CONTROL_VALUE 1000
# define _APS_NEXT_SYMED_VALUE 101

_APS_NEXT_RESOURCE_VALUE es el siguiente valor de símbolo que se utilizará para un recurso de cuadro de diálogo, de recursos de menú y así sucesivamente. El rango válido para valores de símbolo de recursos es 1 para 0x6FFF.

_APS_NEXT_COMMAND_VALUE es el siguiente valor de símbolo que se utilizará para la identificación de una comando. El rango válido para valores de símbolo de comandos es 0 x 8000 a 0xDFFF.

_APS_NEXT_CONTROL_VALUE es el siguiente valor de símbolo que se utilizará para un control de cuadro de diálogo. El rango válido para valores de símbolo de control de diálogo es 8 a 0xDFFF.

_APS_NEXT_SYMED_VALUE es el siguiente valor de símbolo que se publicará cuando se asigna manualmente un valor de símbolo utilizando el comando nuevo en el explorador de símbolo.

Visual C++ comienza con valores ligeramente más altos que el legal más bajo valor cuando la creación de una nueva.Archivo RC. AppWizard también inicializará estos valores a algo más apropiado para las aplicaciones MFC. Para obtener más información acerca de los intervalos de valores de ID, consulte 20 de nota técnica.

Ahora cada vez que cree un nuevo archivo de recursos, incluso en el mismo proyecto, Visual C++ define los mismos valores _APS_NEXT_ . Esto significa que si añades, decir, múltiples diálogos en dos diferentes.Archivos RC, es muy probable que el mismo # Definir valor se asignará a distintos cuadros de diálogo. Por ejemplo, IDD_MY_DLG1 en la primera.Archivo RC se podría asignar el mismo número, 101, como IDD_MY_DLG2 en un segundo.Archivo RC.

Para evitar esto, debe reservar un intervalo numérico separado para cada uno de los cuatro dominios de IDs en los respectivos.Archivos RC. Para ello, actualizar manualmente los valores _APS_NEXT en cada uno de los.Archivos RC antes de que empezar a agregar recursos. Por ejemplo, si el primero.Archivo RC utiliza los valores predeterminados de _APS_NEXT y, a continuación, puede asignar los siguientes valores _APS_NEXT a la segunda.Archivo RC:

# define _APS_&NEXT_RESOURCE_VALUEnbsp; 2000
# define _APS_NEXT_COMMAND_VALUE 42000
# define _APS_NEXT_CONTROL_VALUE 2000
# define _APS_NEXT_SYMED_VALUE 2000

Por supuesto, es aún posible que Visual C++ asignará ID tantos en la primera.Archivo RC que comienzan los valores numéricos se superpongan las reservadas para el segundo.Archivo RC. Debe reservar intervalos suficientemente grandes para que esto no ocurra.

Administrar las dependencias entre.RC.CPP, y.H archivos

Cuando Visual C++ guarda un.Archivo RC, también guarda cambios de símbolo para el recurso correspondiente.Archivo H. Cualquiera de sus.Archivos CPP que hacen referencia a recursos en el.Archivo RC debe # incluyen el recurso.Archivo H, normalmente desde archivo de encabezado principal del proyecto. Esto conduce a un efecto secundario no deseado debido a la gestión de proyectos internos del entorno de desarrollo que analiza los archivos de origen para las dependencias de la cabecera. Cada vez que agregue un nuevo símbolo en Visual C++, todos los.Archivo CPP que # include de recursos.H tendría que volver a compilar.

Visual C++, evita la dependencia de recursos.H al incluir el siguiente comentario como la primera línea del recurso.Archivo H:

 //{{NO_DEPENDENCIES}}

El entorno de desarrollo interpreta este comentario haciendo caso omiso de los cambios en los recursos.H así que dependientes.No serán necesario volver a compilar archivos CPP.

Visual C++ agrega siempre el //{{NO_DEPENDENCIES}} comentario línea a una.Cuando guarda el archivo el archivo RC. En algunos casos, burlar de la dependencia de generación de recursos.H puede conducir a errores de tiempo de ejecución sin ser detectados en el momento de la vinculación. Por ejemplo, si utiliza el navegador de símbolo para cambiar el valor numérico asignado a un símbolo de un recurso, el recurso no ser correctamente encontrado y cargado en caso de tiempo de ejecución de aplicación la.No se vuelve a compilar archivo CPP refiriéndose al recurso. En tales casos, debe compilar explícitamente cualquiera.Archivos CPP que sabe que son afectados por los cambios de símbolo en recursos.H o seleccione reconstruir todo. Si tienes la necesidad de cambiar con frecuencia valores de símbolo para un determinado grupo de recursos, usted probablemente resultará más conveniente y segura salir de estos símbolos en un archivo de encabezado de sólo lectura independiente, tal como se describe en la sección anterior, Incluidos los archivos de encabezado adicional.

Cómo administra de Visual C++ incluye información

Como se señaló anteriormente, el menú Archivo, comando conjunto incluye permite especificar tres tipos de información:

Lo siguiente describe cómo Visual C++ mantiene esta información en un.Archivo RC. No necesita esta información para utilizar Visual C++, pero puede mejorar su comprensión por lo que más confianza puede utilizar la función Set incluye.

Cada uno de los tres tipos anteriores de conjunto incluye información se almacena en el.Archivo RC en dos formas: (1) como # incluir o otras directivas interpretables por el compilador de recursos y (2) como recursos especiales en el TEXTINCLUDE interpretables sólo por Visual C++.

El propósito del recurso TEXTINCLUDE es almacenar de manera segura información definir incluir en una forma que sea fácilmente presentable en el cuadro de diálogo del Visual C++ conjunto incluye. TEXTINCLUDE es un tipo de recurso definido por Visual C++. Visual C++ reconoce tres recursos específicos de TEXTINCLUDE que tienen el recurso de los números de identificación 1, 2 y 3:

TEXTINCLUDE recursos i.d. Tipo de conjunto incluye información
1 Archivo de encabezado de símbolos
2 Directivas de símbolo de sólo lectura
3 Directivas de compilación

Cada uno de los tres tipos de conjunto incluye información ilustrada por el defecto MYAPP.RC y recursos.H archivos creados por AppWizard, tal como se describe a continuación. El \0 extra y "" símbolos entre bloques BEGIN y END requeridos por el RC sintaxis para especificar cero cadenas terminadas y el carácter de comilla doble respectivamente.

Archivo de encabezado de símbolos

La forma de la información de archivo de encabezado de símbolo interpretada por el compilador de recursos es instrucción simplemente un # include:

# include "resource.h"

El correspondiente recurso de TEXTINCLUDE:

1 TEXTINCLUDE DISCARDABLE
BEGIN
   # resource.h\0 "
FINAL

Directivas de símbolo de sólo lectura

Directivas de símbolo de sólo lectura se incluyen en la parte superior de MYAPP.RC en el siguiente formulario interpretable por el compilador de recursos:

# include "afxres.h"

El correspondiente recurso de TEXTINCLUDE:

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

Directivas de compilación

Directivas de compilación se incluyen al final del MYAPP.RC en el siguiente formulario interpretable por el compilador de recursos:

#ifndef APSTUDIO_I&NVOKED
///////////////////////
//
/ / TEXTINCLUDE 3
//
# include "res\myapp.rc2"nbsp; / / no Visual C++ editar recursos

# include "afxres.rc" / / estándar componentes
# include "afxprint.rc" / / recursos de vista previa de impresión e impresión
# endif / / no APSTUDIO_INVOKED

La Directiva APSTUDIO_INVOKED de #ifndef indica a Visual C++ para saltar directivas de compilación.

El correspondiente recurso de TEXTINCLUDE:

3 TEXTI&NCLUDE DISCARDABLE
BEGIN
"# include" "res\myapp.rc2""nbsp; / / no Visual C++ editado resources\r\n "
"\r\n"
"# include""afxres.rc" "/ / estándar components\r\n"
"# include""afxprint.rc" "/ / resources\r\n de vista previa de impresión e impresión"
"\0"
FINAL

&Notas técnicas por número |nbsp; Notas técnicas por categoría

Index