2011-12-21 22 views
7

Tenemos un proyecto DLL que existe desde hace mucho tiempo (tal vez desde Visual Studio 6) que se ha actualizado para cada nueva versión de VS. El proyecto contiene un número de clases COM implementadas usando ATL.¿Cómo puedo agregar un "Objeto simple de ATL" al antiguo proyecto de DLL ATL actualizado a VS 2010?

Después de la actualización a VS 2010, el proyecto sigue construyendo bien. Sin embargo, si intento hacer clic derecho en el proyecto y seleccione Agregar ->Clase ... ->Objeto simple ATL, me sale un cuadro de error que dice lo siguiente:

clases ATL puede solo se debe agregar a proyectos o proyectos DLL de MFC EXE y MFC con soporte completo de ATL.

Esto funcionó en VS 2008.

Cuando miro a las propiedades del proyecto, El uso de MFC se establece en uso estándar bibliotecas de Windows y El uso de ATL se fijó a No Uso ATL. Los cambié a Utilice MFC en un archivo DLL compartido y Enlace dinámico a ATL respectivamente, pero sigue recibiendo el mismo error.

Sé cómo agregar nuevos objetos ATL sin usar el asistente, y podría intentar recrear el proyecto desde cero utilizando VS 2010 para hacerlo feliz. Pero, ¿alguien sabe de alguna manera fácil de obtener VS para permitirme usar el asistente ATL Simple Object con un proyecto que no reconoce como un proyecto "con soporte ATL completo"?

Respuesta

9

Verificar this thread out.

Parece que al agregar este fragmento de información su código ATL C++ lo hace funcionar. No es necesario que realmente construyas el proyecto, solo quítalo después de que hayas terminado con el asistente (siempre que la solución funcione para ti).

// Added fake code begins here 

class CAppModule : 
    public CComModule 
{ 
}; 

// Added fake code ends here, below is regular ATL project stuff 

CAppModule _Module; 

Esto es donde todo proviene de, en $(VisualStudio)\VC\VCWizards\1033\common.js:

/****************************************************************************** 
Description: Returns a boolean indicating whether project is ATL-based. 
oProj: Project object 
******************************************************************************/ 
function IsATLProject(oProj) 
{ 
    try 
    { 
     var oCM = oProj.CodeModel; 
     oCM.Synchronize(); 
     // look for global variable derived from CAtlModuleT 
     var oVariables = oCM.Variables; 
     for (var nCntr = 1; nCntr <= oVariables.Count; nCntr++) 
     { 
      var oVariable = oVariables(nCntr); 
      var strTypeString = oVariable.TypeString; 
      if (strTypeString == "ATL::CComModule" || strTypeString == "ATL::CAutoThreadModule") 
      { 
       return true; 
      } 
+0

Efectivamente, añadiendo que el código de hecho todo el trabajo. ¡Gracias! –

+0

Pensé más tarde que una función edit 'IsATLProject (oProj) {return true; } 'es aún más confiable, pero tomaría uno buscar la secuencia de comandos del asistente ... Y el primer truco es solo con el origen del proyecto. –

+0

FWIW, pude reducir el código necesario a una sola línea: "class CDummyModule: public CComModule {} DummyModule;" Esto también previene cualquier error debido a la definición _Module existente. Y asegúrese de eliminarlo o comentarlo antes de crear el proyecto, para evitar problemas causados ​​por tener varios objetos derivados de CComModule. –

3

El mismo problema aquí, pero la fuente del proyecto ya tenía CComModule _Module; arreglaron, basado en el guión IsATLProject shown above, cambiándola a **ATL::**CComModule _Module;

Cuestiones relacionadas