Pregunta

Usando VC2005, tengo 3 proyectos para construir:

  • libA (contiene un typelib, da como resultado libA.dll): IDL tiene una línea library libA { ...
  • libB (contiene un typelib que importa libA, da como resultado libB.dll): IDL tiene una línea importlib( "libA " );
  • libC (importa libB): uno de los archivos fuente contiene #import <libB.dll>

el __missing_type__ es manejado por el compilador de la siguiente manera (de acuerdo con la documentación):

  1. directorios de búsqueda de% PATH%
  2. directorios de búsqueda de% LIB%
  3. buscar " adicional incluye rutas " (/ I opción del compilador)

Al compilar libC, puedo ver que cl.exe claramente puede encontrar el libA.dll en la ruta ejecutable (usando Filemon.exe)

Error de VC C4772: #import de typelib con otra dependencia

Sin embargo, todavía se encuentra el espacio de nombres libA no y todas las referencias a los tipos libA se reemplazan por <=>

(editar) Mientras tanto, descubrí que el problema solo aparece cuando se usan los dlls de depuración.

¿Alguien ha visto este problema antes? ¿Y lo resolvió?

¿Fue útil?

Solución 4

¡Finalmente lo encontré!

En el proyecto de Visual Studio, el archivo A.idl en LibA tenía la configuración MkTypeLib Compatible activada. Esto anuló el comportamiento heredado del proyecto A. Para empeorar las cosas, solo estaba activado en la configuración de depuración.

La consecuencia fue que por cada

typedef [public] tagE enum { cE1, cE2 } eE;

Esto provocó que tagE no se definiera en la biblioteca de tipos resultante. Cuando LibB hizo su import( "A.dll" ), todas las referencias a __missing_type__ fueron reemplazadas por <=> ...

Otros consejos

¿Está configurando explícitamente las dependencias del proyecto? En otras palabras, ¿ha configurado la solución en el IDE para que el proyecto C dependa del proyecto B y el proyecto B dependa del proyecto A?

¿Está utilizando los tipos definidos en libA desde libC? Si es así, creo que necesita importar directamente libA desde libC para que conozca los tipos de libA. COM no hace referencia automáticamente a las bibliotecas de tipos a las que hace referencia otra biblioteca de tipos.

No tengo una respuesta para ti, pero tuve esta experiencia varias veces y me gustaría compartir lo que hice.

En varios proyectos no relacionados, tuve su mismo escenario. Intenté durante casi una semana en un caso resolver las dependencias, pero eventualmente tuve que reducir mis pérdidas para cumplir con el cronograma. Terminé usando un #include en el archivo .tlh (realizar una importación en la DLL generará estos), luego usando & Quot; classic com & Quot; API llama para obtener punteros a las estructuras dentro de los archivos .tlh. El código no es tan limpio para trabajar como lo sería si pudiera usar los archivos de envoltura, pero funciona.

IUnknown *lpUnk;
hr = CoCreateInstance(clsID, NULL, CLSCTX_LOCAL_SERVER, IID_IUnknown, (void **)&lpUnk);
if (FAILED(hr)) throw SomeException;  

                                          //
_Application *app;                        //Address _Application  
hr = lpUnk->QueryInterface(__uuidof(_Application), (void **) &app);
lpUnk->Release();
if (FAILED(hr)) throw SomeException;  

                                          // Do stuff with the app object  
app->Release();                           // Then release

Puede algo " des-uglify " esto mediante el uso de la plantilla de contenedor CComPtr para realizar el lanzamiento de manera confiable desde su destructor cuando se sale del alcance:

CComPtr<IUnknown> lpUnk;
hr = CoCreateInstance(clsID, NULL, CLSCTX_LOCAL_SERVER, IID_IUnknown, (void **)lpUnk);
if (FAILED(hr)) throw SomeException;  
                                          //
CComPtr<_Application> app;                //Address _Application  
hr = lpUnk->QueryInterface(__uuidof(_Application), (void **) &app);
if (FAILED(hr)) throw SomeException;
                                         //
                                         // Do stuff with the app object

Tenga en cuenta que el puntero _Application es un ejemplo de uso de una de las estructuras de un archivo .tlh.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top