Pregunta

Tengo una test.exe llamado exe que se utiliza generalmente como una aplicación independiente. Quiero utilizar este exe como módulo (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();
}

Cuando someMethod() es virtual y MyClass tiene un d'tor virtual.
doTest() se exporta desde test.exe y por lo tanto una llamada lib Test.lib se crea
app.exe está vinculada con este lib para cargar estáticamente test.exe cuando se inicia.

Cuando estoy corriendo test.exe autónomo que funciona muy bien, pero cuando estoy corriendo este se abra desde el interior de app.exe de que se estrelle.
Al entrar en el código con el depurador reveló que el accidente se encuentra en la llamada al método virtual. Resulta que la vftable alguna manera va mal.

Después de algunas investigaciones Resulta que cuando el código dentro del constructor de MiClase está en funcionamiento, el vftable es una cosa, pero cuando la llamada a new retornos es sustituir con otra cosa llamada "vftable locales". He encontrado esta discusión oscura acerca de por qué esto es .

Después de un día de depuración se me ocurrió que los punteros en este "vftable locales" son los mismos en ambos casos, cuando test.exe pueda funcionar autónomamente y whenit 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 he cambiado la dirección de carga en las opciones del vinculador a aquel en el que se carga test.exe cuando está en app.exe y ahora, he aquí que todo funciona.

Obviamente, esto no es una solución permanente porque la próxima vez esta dirección seleccionada al azar puede ser ocupado y el mismo problema se producirá de nuevo.

Así que mi pregunta: ¿Por qué es este "vftable locales" ligada a la dirección de carga estática del exe? se carga un archivo EXE como un módulo malo? ¿por qué asumir el exe se carga a su dirección estática?

Sólo por contexto:. Todo esto se hace con MSVC 2008, Windows XP x64

¿Fue útil?

Solución 2

La solución Terminé usando es simplemente agregar una configuración de compilación y compilar el ejecutable como un archivo DLL real en lugar de forzarlo a actuar como uno.

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

Otra diferencia entre I exes y DLL es que el punto de entrada es diferente. Se DLLMain punto de entrada de un archivo DLL donde como un exe tiene su punto de entrada en el CRT que se pide finalmente principal () o WinMain ().

Otros consejos

VC ++ excluye los datos de reubicación de .EXEs por defecto, ya que normalmente no necesitan ser reubicable.

Puede forzarlo para retener la información con reloc / fijo: no. Ver: http://msdn.microsoft.com/en-us/library/ w368ysh2.aspx

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