Foros del Web » Programación para mayores de 30 ;) » C/C++ »

argument of type `LRESULT (MiApp::)(HWND__*, UINT, WPARAM, LPARAM)' does not match `L

Estas en el tema de argument of type `LRESULT (MiApp::)(HWND__*, UINT, WPARAM, LPARAM)' does not match `L en el foro de C/C++ en Foros del Web. Veran esta traajando con la api de windows para hacer una appicacion oiaentada a objetos, he creado una clase llamda MiApp, la cual encapsula la ...
  #1 (permalink)  
Antiguo 05/09/2006, 17:36
arm
 
Fecha de Ingreso: mayo-2006
Mensajes: 112
Antigüedad: 18 años
Puntos: 0
argument of type `LRESULT (MiApp::)(HWND__*, UINT, WPARAM, LPARAM)' does not match `L

Veran esta traajando con la api de windows para hacer una appicacion oiaentada a objetos, he creado una clase llamda MiApp, la cual encapsula la clase de la ventana principal. Un de las funciones miebro de esta clase es

WndProc(HWND__*, UINT, WPARAM, LPARAM);

esta es la funcion que utiliara la clase como fncion de ventana, pero al querer signarla, me da el error siguiente

argument of type `LRESULT (MiApp::)(HWND__*, UINT, WPARAM, LPARAM)' does not match `LRESULT (*)(HWND__*, UINT, WPARAM, LPARAM)'


Cre que entiendo el erro, pero no se co solucionarla, deseguro les dara isa, pero he intentand desde conversion mendiante void* hasta rinterprete_cast.
__________________
-> La duda adecuada es un buen comienzo <-
  #2 (permalink)  
Antiguo 05/09/2006, 23:45
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Je je, ya tan pronto estas intentando POO con el WinAPI?

primero aprende a caminar, jeje.

Este problema es muy clasico, cuando alguien quiere adaptar el WinAPI a la POO.

el problema es este.

Que tipo es el miembro de la estructura lpfnWndProc??

La respuesta, es un typedef WNDPROC el cual es un puntero a una funcion de tipo:
LRESULT CALLBACK Proc(HWND, UINT, WPARAM, LPARAM).

el puntero es este

typedef LRESULT (CALLBACK*WNDPROC)(HWND, UINT, WPARAM, LPARAM);

ahora tu Procedimiento de ventana no concuerda con este tipo.
ya que el tuyo es:

LRESULT App::WndProc(HWND, UINT, WPARAM, LPARAM);

es una funion miembro, y en C++ un puntero a funcion no es lo mismo que un puntero a funcion miembro.

por tanto a lpfnWndProc solo le podemos asignar una funcion estatica o un a funcion no miembro.

por tanto hay 2 formas de solucionar esto.

usar WndProc como una funcion miembro estatica o como una funcion global amiga de tu clase.

con eso creo que resuelves tu problema, despues te encontraras con otro muy clasico, pero todo a su tiempo..

Saludos.
  #3 (permalink)  
Antiguo 06/09/2006, 15:17
arm
 
Fecha de Ingreso: mayo-2006
Mensajes: 112
Antigüedad: 18 años
Puntos: 0
Solo esas dos opciones.

Noooooooooooooooooooooooooooooooooooooooooo.....
__________________
-> La duda adecuada es un buen comienzo <-
  #4 (permalink)  
Antiguo 06/09/2006, 18:41
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Que otra podrias esperar?

solo hay funciones:

globales.
globales amigas.
miembro estaticas.
miembro.


y a un puntero a funcion, puedes asignar solo las primeras 3.
la 4ta, solo puede ser asignada a un puntero a funcion.

Saludos.
  #5 (permalink)  
Antiguo 07/09/2006, 15:20
arm
 
Fecha de Ingreso: mayo-2006
Mensajes: 112
Antigüedad: 18 años
Puntos: 0
mmmm.... no lo sea, hasta ahora C++ nunca me habia restingido tanto, lo que pasa es que quiero que sea realmente una estructura POO pura (imaginas el sentimiento?) y hasta ahora siempre he tenido una posibilidad como, por ejemplo con los con los arreglos dinamicos, aun es mas dificil que los comunes, seguia teniedo la posivilidad.

Tal vez te paraeca gracioso, pero intente utilizar conversiones, incluso quise utilizar el ensamblador para accesar a la posicion donde se guarda el puntero a WndProc, pero no se donde queda eso.
Despues de todo me desidire por la funciones amigas por pienso utilzar un macro para gestinar la declaracion e implementacion.
__________________
-> La duda adecuada es un buen comienzo <-
  #6 (permalink)  
Antiguo 07/09/2006, 18:10
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Bueno, podrias implementar tu propia funcion DispatchMessage(), tal vez de esta forma podrias hacerlo totalmente POO, pero la verdad no se que resultados puedas tener.

otra solucion es, que a nivel global, declares el WndProc, y que desde esa funcion invokes el WndProc de tu aplicacion la cual si es una funcion miembro.


ejemplo:

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
App* app = (App*)GetWindowLong(hwnd, GWL_USERDATA);
return app->WndProc(hwnd, message, wParam, lParam);
}

de esta forma el elemento que sera global solo sera un punente al WndProc real.
en este caso seria mejor usarla como estatica, para no ronper la estructura.

es decir tendrias un WndProcS miembro estatico y un WndProc miembro.

y no se a que te refieres con usar macros.

Saludos.
  #7 (permalink)  
Antiguo 07/09/2006, 19:13
arm
 
Fecha de Ingreso: mayo-2006
Mensajes: 112
Antigüedad: 18 años
Puntos: 0
achis...achis..., a que te refieres con que puedo implementar mi propia DispatchMessage(), ¿quieres decir envolverla en un funcion que yo llamaria?
y luego...?
__________________
-> La duda adecuada es un buen comienzo <-
  #8 (permalink)  
Antiguo 08/09/2006, 01:37
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Era una sugerencia, solo si conoces el funcionamiento interno de esta funcion, pero eso esta dificil.

sabes, aunque lograras la convercion(casting) no te ayudaria mucho, ya que un puntero a funcion miembro se invoca de forma diferente a como se invoka un puntero a funcion global.
por tanto DispatchMessage no podria invokar a tu WndProc.

no te compliques tanto y usala como miembro estatica.
ya despues veremos como salir adelante.

Saludos.
  #9 (permalink)  
Antiguo 08/09/2006, 16:12
arm
 
Fecha de Ingreso: mayo-2006
Mensajes: 112
Antigüedad: 18 años
Puntos: 0
Si, ya veo.

Buene muchas gracias de nuevo.
__________________
-> La duda adecuada es un buen comienzo <-
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:32.