2011-05-28 10 views
5

estaba escribiendo un DllMain como esto:¿No llamaron a Dllmain?

#include "main.h" 
#include "init.h" 
#include <iostream> 
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 
{ 
//std::cout<<"hi\n"; //only for debug. did not shown. 
switch (fdwReason) 
{ 
    case DLL_PROCESS_ATTACH: 
     // attach to process 
     // return FALSE to fail DLL load 
     //std::cout<<"hello\n"; //only for debug. did not shown. 
     init(); //did not run :(
     break; 

    case DLL_PROCESS_DETACH: 
     // detach from process 
     break; 

    case DLL_THREAD_ATTACH: 
     // attach to thread 
     break; 

    case DLL_THREAD_DETACH: 
     // detach from thread 
     break; 
} 
return TRUE; // succesful 
} 

pero después de un programa de prueba utiliza LoadLibrary(), no pasó nada, no hola hola o en la pantalla. ¿Te gustaría descubrir el problema? ¡Muchas gracias!

P.S. He visto la pregunta DllMain not being called pero todavía no ayuda.

PS2: el programa que llama es como

int main() 
{ 
cout<<"This is a test program to test.\n"; 
HINSTANCE hinstDLL; 
hinstDLL=LoadLibrary("ijl15.dll"); 
cout<<"Look like everything goes well.\n"; 
cout<<hinstDLL; 
return 0; 
} 

Los productos de los programas probador:

This is a test program to test. 
Look like everything goes well. 
0x6a980000 
Process returned 0 (0x0) execution time : 0.007 s 
Press any key to continue. 
+0

Hmm ... parece estar bien ... ¿puedes agregar el código de LoadLibrary()? Además, para estar seguro, estás buscando impresiones en la ventana de la consola, ¿verdad? – TCS

+0

Estaba dispuesto a ver que se ejecuta init(), pero nunca funciona así que probé un poco pero todavía no funciona. – xxbidiao

+0

¿Cuáles son sus conmutadores de enlace para el todo? –

Respuesta

8

Después de algunos intentos (hay mucho :() Me di cuenta de que echaba de menos

#define DLL_EXPORT extern "C" __declspec(dllexport) 

Esto hace que el nombre de la función correctamente y finalmente el DLLMain se llama éxito. De todos modos, gracias a todos!

+1

¿Cómo soluciona el problema? ¿Dónde usas 'DLL_EXPORT' en el código? –

1

Sospecho que es el código de la interacción de consola que está apagado. Podría intentar hacer algo un poco menos sutil, como abrir una ventana o escuchar un sonido.

+1

OutputDe bugString() es ideal para este tipo de cosas. – Ferruccio

+0

@Ferruccio en init() hay otras cosas como escribir log en un archivo, pero no funcionó para nada ... Por fin DLLMAIN falló :(¡pero gracias de todos modos! – xxbidiao

1

Tiene muchas limitaciones en cuanto a lo que puede hacer en DLLMain. específicamente, hacer cualquier E/S es normalmente un no-no. Está ahí para hacer una inicialización simple, no para actuar como main() en un ejecutable.

+0

En realidad, hola y hola son solo para depurar , e init() no se ejecutó. – xxbidiao

+0

@xxbidiao OK, ¿qué hace init()? –

+0

Acerca del IO: ¿está seguro? AFAIK en 'DllMain' lo único que puede confiar es que Kernel32.dll está cargado , y las funciones Win32 IO están ahí. Obviamente, no puede estar seguro de lo que hace el CRT, pero con Win32 IO directo, debe estar seguro. De todos modos, acordó que DllMain es solo para inicialización "interna" pequeña, para cosas pesadas que debería proporcionar una función separada. –

0

¿De verdad LoadLibrary devuelve un valor (lo que se muestra en la llamada cout<<hinstDLL)?

¿Su dll está en el mismo directorio o está disponible a través de la variable de entorno PATH?

¿Tiene varias versiones de su dll en diferentes lugares (versión frente a depuración)?

+0

El resultado del programa de prueba es: Este es un programa de prueba para evaluar. Parece que todo va bien. 0x6a980000 Proceso devuelto 0 (0x0) tiempo de ejecución: 0.007 s Presione cualquier tecla para continuar. ... Algo así – xxbidiao