visual valido studio seleccione proyecto inicio elemento como code abrir visual-studio visual-c++ build mfc target

visual-studio - proyecto - seleccione un elemento de inicio valido visual studio



Cómo usar diferentes archivos de recursos para diferentes objetivos de compilación en MFC (4)

Tengo algunos recursos que son específicos del objetivo. Como un diálogo diferente para el cliente de destino y un diálogo diferente para el administrador de destino. Y también algunas cadenas que son específicas para cada uno de los objetivos. No quiero que los recursos y el código que son específicos de la aplicación de administración estén presentes en la compilación del cliente.

Supongamos que puedo tener 3 archivos de recursos, administrador , cliente y común y, de alguna manera, decirle al motor de compilación que use admin y res comunes para compilación de administrador, y use res comunes y de cliente para compilación de clientes.

¿Cómo puedo conseguir esto?

¿Cómo puedo tener más de 1 archivo de recursos y usar un archivo de recursos para una compilación de destino específica?


Con la descripción dada, no veo la necesidad de diferentes archivos .RC. Puede tener una tabla de cadenas con cadenas para ambos (o múltiples destinos). Al inicio, tendrá variables UINT que apuntarán a cualquiera de ellos. Por ejemplo:

UINT nUserConfirmationId; UINT nAcessDeiniedMsgId; if(target1) { nUserConfirmationId = IDD_ENG_STRING_ID_FOR_CONFIRM; .. } else { nUserConfirmationId = IDD_FRE_STRING_ID_FOR_CONFIRM; ... }

Y luego use las variables nUserConfirmationId etc. De manera similar, puede tener recursos de diálogo (no veo por qué necesita diferentes diálogos, solo las cadenas deben reemplazarse). Sí, tiene problemas de mantenimiento a medida que agrega recursos.

O bien, puede tener DLL de solo recursos, que contendrán recursos específicos de destino.


Puede usar #ifdef en su archivo .rc. Sin embargo, esto arruinará el editor de recursos. La forma "estándar" de lidiar con esto es tener archivos .rc separados para cada objetivo, luego #incluyendo cada uno de ellos en un script en el que usted hace el #ifdef, por ejemplo

#ifdef CLIENT_1 #include "client_1.rc" #endif #ifdef CLIENT_2 #include "client_2.rc" #endif

De esta forma, el editor de recursos solo necesita analizar archivos rc "completos". Aún así, trabajar así es un dolor, porque el editor se confunde fácilmente. Érase una vez también experimenté con tener un proyecto separado para cada "objetivo", y luego # incluyéndolos con rutas relativas en mi sección "recurso incluye". No recuerdo por qué no usé ese enfoque al final. Usando el preprocesador puede hacer que esto funcione, pero siempre se siente un poco torpe. Tal vez las versiones recientes de VS se ocupen mejor de esto.


OK, aquí está mi puñalada para responder completamente a tu pregunta, si fuera solo que sería divertido obtener una recompensa (no sucede tan a menudo en las preguntas con etiquetas MFC :)). Indique qué áreas de su pregunta cree que no están abordadas, si corresponde. Esto es todo con VS 2008, los cambios a otras versiones deben ser mínimos.

  • Comience agregando archivos de recursos para cada uno de sus objetivos de compilación diferentes, por ejemplo, "admin.rc", "common.rc", etc. En el navegador de soluciones, haga clic con el botón derecho en su proyecto, "Agregar-> Nuevo elemento-> Archivo de recursos ".

  • Haga clic con el botón derecho en los archivos de recursos recién agregados en el navegador de soluciones, seleccione "propiedades" y en "General" configure "Excluir de compilación" a "Sí".

  • En la Vista de recursos, ahora puede agregar sus recursos necesarios a los respectivos archivos de recursos.

  • A continuación, en la vista de recursos, haga clic derecho en el archivo de recursos "principal" () y seleccione "El recurso incluye".

  • En el cuadro inferior, al final de lo que sea que esté allí, agregue

#ifdef ADMIN #include "admin.rc" #endif

Por supuesto, el símbolo para usar en el preprocesador puede elegir usted mismo, y el nombre de archivo debe coincidir con lo que elija cuando creó el archivo de recursos anteriormente.

  • Luego, en su configuración de proyecto "Admin" (supongo que está utilizando configuraciones diferentes para cada objetivo?) Y en el Explorador de soluciones, haga clic derecho en su proyecto y vaya a "Recursos-> General". En "Definiciones de preprocesador", agregue "ADMIN" (o lo que elija en el paso anterior).

  • Construye tu solución. Puede verificar qué recursos se incluyeron en su binario usando algo como http://www.wilsonc.demon.co.uk/d10resourceeditor.htm o http://melander.dk/reseditor/ .

Tenga en cuenta que, obviamente, tendrá que considerar que los recursos no están disponibles en las distintas compilaciones; por lo que deberá asegurarse de que, por ejemplo, no se muestren cuadros de diálogo que utilicen un IDD de diálogo en su constructor. Usted puede hacer esto a través del preprocesador también; simplemente agregue el mismo indicador al preprocesador C ++ en la configuración respectiva.

Otro problema es que tendrá un resource.h para cada archivo .rc, y cada uno usará su propia numeración. Puede hacer que esto funcione a través de una asignación de nombres y numeración cuidadosos, pero asignaría un rango diferente a cada uno para tratar de detectar la mayor cantidad posible de problemas en tiempo de compilación. Para hacer esto, abra su "resource1.h" o lo que sea que haya llamado y cambie las definiciones _APS_NEXT__VALUE a números más altos.

Alternativamente, puede pegar todas las definiciones de recursos en un recurso.h y editar todos los archivos .rc para incluir ese recurso.h. Simplemente haga clic derecho en el archivo rc en el Explorador de soluciones, luego seleccione "abrir con" y haga clic en "Editor de código fuente". Deberás familiarizarte con el formato de los archivos rc de todos modos (al menos por lo básico), si vas por la ruta de "construcción de recursos complicados". No es difícil, solo asegúrate de obtener una imagen mental de cómo el enlazador, el compilador de recursos, los archivos .rc, tus archivos .cpp y el archivo resource.h se relacionan entre sí. Además, los valores del preprocesador específico de MFC parecen intimidantes al principio, pero se explican por sí solos en su mayoría, y usted puede ignorarlos la mayor parte del tiempo de todos modos.

El Petzold tiene una explicación sucinta pero suficiente de los archivos de recursos y su formato, es posible que desee extraer eso del armario y tenerlo a mano mientras se está acostumbrando.


Si solo tiene unos pocos recursos que son específicos de la configuración, puede que le resulte más fácil y más fácil de compartir el .rc entre las configuraciones, pero haga que utilicen diferentes subconjuntos de recursos. También es compatible con VS (2017, al menos): Agregar condición para recursos individuales.

En el Explorador de soluciones , haga doble clic en .rc para abrir la Vista de recursos . Desde el árbol de recursos, haga clic con el botón derecho en el diálogo, icono, etc. de los que le gustaría depender de la configuración, luego abra Propiedades .

En la ventana de propiedades, debería ver la condición .

Ahora, ya debe tener símbolos de preprocesador definidos exclusivamente para sus compilaciones de cliente, servidor y administrador. (Si no lo hace, hágalo ahora! Páginas de propiedades -> C / C ++ -> Preprocesador -> Definiciones de preprocesador ).

Simplemente agregue este símbolo a la condición . Esto tiene el efecto de agregar un #ifdef ... #endif alrededor del bloque de código en su archivo .rc , pero de manera amigable con VS, no rompe el editor.

Nota: Me he dado cuenta, sin embargo, de que este proceso no parece funcionar para String Tables . No puedo decir si es un error de UI o simplemente no es compatible.