C/Visual C - Dlls

 
Vista:

Dlls

Publicado por Federico  (40 intervenciones) el 06/04/2009 18:00:58
Tengo el siguiente problema con una DLL que estoy creando
resulta que cuando llamo a CreateWindowEx no me funciona, mi pregunta es, es realmente posible usar ventanas en una DLL?

Muchas Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Dlls

Publicado por fernando.gomez (1603 intervenciones) el 06/04/2009 20:36:33
Sí, puedes usar CreateWindowEx. Solo asegúrate de que primero registres la clase de la ventana, que si no CreateWindowEx fallará.

Otra posibilidad es que en tu bucle de mensajes, al procesar WM_CREATE estés regresando -1. Cuando esto pasa, CreateWindowEx falla sin dar la menor explicación.

Para ver qué está pasando, después de la llamada a CreateWindowEx, llama a GetLastError. Obtén el DWORD que te regresa y abre el programita del visor de errores (en mi instalación, se ubica en C:Program FilesMicrosoft Visual Studio 9Common7Toolserrlook.exe). Ahí te dará una descripción del error, que quizás te de más información al respecto.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Dlls

Publicado por Federico  (40 intervenciones) el 06/04/2009 22:39:49
antes que nada te agradezco por tu ayuda, te cuento lo que probe mas detalladamente.

efectivamente previamente ejecuto RegisterClassEx, la cual no me retorna error, por lo cual asumo que la clase esta registrada. acontinuacion te detallo la clase

hLibInst es la instancia de la DLL

WNDCLASSEX ClassEx;
ClassEx.cbClsExtra = 0;
ClassEx.cbSize = sizeof(WNDCLASSEX);
ClassEx.cbWndExtra = 0;
ClassEx.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
ClassEx.hCursor = LoadCursor(NULL, IDC_ARROW);
ClassEx.hIcon = LoadIcon(hLibInst, IDI_APPLICATION);
ClassEx.hIconSm = LoadIcon(hLibInst, IDI_APPLICATION);
ClassEx.hInstance = hLibInst;
ClassEx.lpfnWndProc = WindowProcedure;
ClassEx.lpszClassName = "ClassLogin";
ClassEx.lpszMenuName = NULL;
ClassEx.style= CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS;

if(!RegisterClassEx(&ClassEx))
return (HWND)0;

Luego creo la ventana

hWnd = CreateWindowEx(WS_EX_TOPMOST, "ClassLogin","Login", 0, 0, 0, WINWIDTH, WINHEIGHT, 0,NULL,hLibInst ,NULL);
if(hWnd){
ShowWindow(hWnd, SW_NORMAL);
UpdateWindow(hWnd);
}

Cuestion que hWnd = 0 y GetLastError tambien

Lo que no me quedo claro fue lo del WM_CREATE, este mensaje tiene que ser capturado por la DLL, de ser asi como lo haria?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Dlls

Publicado por fernando.gomez (1603 intervenciones) el 07/04/2009 08:53:39
Hola.

WM_CREATE es un mensaje que se captura en el bucle de mensajes de tu ventana. Este bucle es, en esencia, una llamada a la función que registras en la siguiente línea:

ClassEx.lpfnWndProc = WindowProcedure;

Es decir, WindowProcedure es un puntero a una función (callback), el cuál usualmente revisará el tipo de mensaje que se le envía y procesará los que considere necesarios (usualmente, a través de un switch enorme).

Uno de estos mensajes es el de WM_CREATE, que se envía cuando la ventana ha sido ya creada, pero antes de mostrarla al usuario. En general, uno atrapa este mensaje para hacer inicializaciones de la ventana (como crear ventanas hijas). Si una de estas inicializaciones falla, normalmente se regresa un -1. En tal caso, la ventana postea un mensaje WM_DESTROY, destruyendo la ventana y terminándola.

Yo he tenido este problema en algunas ocasiones, y usualmente es porque al atrapar WM_CREATE; regreso -1, o bien, alguna de las ventanas hijas falla al crearse.

¿Por qué puede fallar? Quizás algún parámetro dentro de la función Create asociada es inválido, o el bucle de mensajes no se pudo alcanzar. Por eso tedecía que revisaras esa parte. Fuera de eso, sin ver más código, es difícil de decir algo más.

Con respecto a las DLLs, la diferencia entre una función en una DLL y otra en tu proceso normal son en esencia, las fronteras de memoria. Fuera de eso, actúan de forma normalita.

¿Quizás la aplicación cliente no puede cargar la DLL?

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Dlls

Publicado por Federico (40 intervenciones) el 07/04/2009 15:41:14
Nuevamente realmente te agradezco por tu colaboracion.
ahora continuemos a ver si podemos desentrañar el problema,

Dentro del bucle de mensajes cuando recibo un WM_CREATE unicamente mande un break; de esa manera despojo cualquier tipo de problema, igualemte la funcion CreateWindowEx sigue retornando 0. Para probar que los parametros de la funcion esten correctos, copie tanto la clase como la llamada a CreateWindowEx a un programa Win32 y compile, resulta que en este caso la funcion no falla, y me retorna un handler correcto, por lo tanto el motivo esta en la DLL, para mi el error viene por el lado de la instancia de la DLL o el procedimiento de ventana, ya que los demas datos tanto de la clase como de la ventana son valores comunes.
Ahora lo que me preocupa es que como es posible que GetLastError no retorne error ante el fallo de la funcion.
Con respecto a lo de la aplicacion cliente, la misma esta cargando la DLL, ya que las demas funciones no tienen problema, igualmente cree otra apliacion para probarla y tambien falla en la parte de la creacion de la ventana, por lo tanto descarte qe se trate de un tema de la aplicacion cliente.

Muchas Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Dlls

Publicado por Federico (40 intervenciones) el 07/04/2009 17:44:00
Te comento que he solucionado el problema, con la cual no estoy conforme te comento lo que hice,

Procese manualmente el mensaje WM_NCCREATE, el cual se envia antes que WM_CREATE, y la unica linea que le puse fue return TRUE, ya que este mensaje debe retornar TRUE para continuar con la creacion de la ventana, magicamente la ventana aparecio y funciona perfectamente, cuestion que no estoy muy conforme con esta solucion ya que en eplicaciones Win32 jamas lo he procesado salvo para casos donde tenia qe cancelar una ventana, si sabes el porqe te pido porfavor si me lo puedes explicar

Muchas Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Dlls

Publicado por fernando.gomez (1603 intervenciones) el 07/04/2009 19:43:27
Ahm... eso quiere decir que el área del no-cliente (NonClient Area) está fallando. Se me ocurre que quizás intentas cargar algún recurso, como un menú o una tabla de aceleradores, y no lo está encontrando...

Por cierto, con los recursos (diálogos, menús, íconos y demás cosas del archivo *.rc)... ¿éstos se encuentran en la misma DLL o en otra? ¿Cómo estás manejando los recursos? Se me ocurre que quizás vaya por ahí...

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Dlls

Publicado por Federico (40 intervenciones) el 07/04/2009 20:56:32
saque todos los recursos, para ver si venia por ese lado, no utilizo aceleradores, la ventana no tiene menu, todo bien pelado, eso es lo que me llama la atencion igualemte voy a leer sobre el area de no cliente, que me acabas de explicar

desde muchas gracias por todo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar