usar registro problema error ejecutar dllregisterserver como codigo archivos agregar 0x80040200 0x80004005 c++ dll exe vtable

registro - C++: cargando un EXE como un DLL, problema local de Vftable



problema dllregisterserver (2)

La solución que acabo de usar es simplemente agregar una configuración de compilación y compilar el exe como un dll real en lugar de forzarlo a actuar como tal.

using /fixed:no no no resolvió el problema por alguna razón.

Otra diferencia entre exes y DLL es que el punto de entrada es diferente. el punto de entrada de un DLL es DllMain, donde como un exe tiene su punto de entrada en el CRT que eventualmente llama a main () o WinMain ().

Ok, entonces este es un poco largo para explicar tan desnudo conmigo ...

Tengo un exe llamado test.exe que generalmente se usa como una aplicación independiente. Quiero utilizar este exe como un módulo (un dll) dentro de otra aplicación, app.exe.

El código en test.exe hace algo realmente simple como:

void doTest() { MyClass *inst = new MyClass(); inst->someMethod(); }

Donde someMethod() es virtual y MyClass tiene un someMethod() virtual.
doTest() se exporta desde test.exe y, por lo tanto, se crea una lib llamada test.lib
app.exe está vinculado con esta lib para cargar estáticamente.exe cuando se inicia.

Cuando ejecuto test.exe autónomo, funciona bien, pero cuando lo ejecuto cargado desde app.exe se bloquea.
Entrar en el código con el depurador reveló que el bloqueo está en la llamada al método virtual. Resulta que el vftable de alguna manera va mal.

Después de algunas investigaciones, resulta que cuando se ejecuta el código dentro del constructor de MyClass, el vftable es una cosa, pero cuando la llamada a los new resultados se reemplaza por otra llamada "local vftable". Encontré esta oscura discusión sobre por qué es esto .

Después de aproximadamente un día de depuración, se me ocurrió que los punteros en este "vftable local" son los mismos en ambos casos, cuando test.exe es independiente y cuando se carga como un módulo. Esto no puede ser correcto porque test.exe se carga en una dirección diferente ...
Para probar esta teoría, cambié la dirección de carga en las opciones del vinculador a la que se carga test.exe cuando está en app.exe y ahora, he aquí, todo funciona.

Obviamente, esta no es una solución permanente porque la próxima vez que esta dirección seleccionada al azar pueda estar ocupada y el mismo problema vuelva a ocurrir.

Entonces mi pregunta: ¿Por qué este "local vftable" está vinculado a la dirección de carga estática del exe? cargar un exe como un módulo es algo malo? ¿Por qué el exe supone que está cargado en su dirección estática?

Solo por contexto: todo esto se hace con MSVC 2008, Windows XP x64.