• Martes 21 de Mayo de 2024, 02:20

Autor Tema:  Usar Una Dll  (Leído 1405 veces)

juancayuso

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
Usar Una Dll
« en: Viernes 20 de Julio de 2007, 18:55 »
0
Hola a todos y a todas estoy usando una dll, concremente TotiPMSpeechRecognitionEngine.dll es de reconocimiento de voz, la cargo con
HMODULE dllHandle = LoadLibrary("TotiPMSpeechRecognitionEngine") sin problemas aparentes, y cuando voy a cargar una de las funciones uso el siguiente codigo:

typedef int (_stdcall * iniciaPTR)(HWND phandle,int a,string u[]);

iniciaPTR iniciar=(iniciaPTR)GetProcAddress(dllHandle, "IniciarUnitReconeixementDeSons");
,compruebo si ha devuelto NULL por si no la he cargado bien pero esta bien, y cuando la llamo con:

a=iniciar(phandle,2,ca); me devuelve el valor distinto de 0 y si es correcto debe devolver 0,

he cargado otras funciones con  GetProcAddress y parece ser que sí me deja usarlas, así que no se si el problema será por los parámetros, el primer parametro es el handle de la ventana donde la uso, y lo he hallado así:

HWND phandle=FindWindow(NULL,"Mi Editor de texto"); y parece que es correcto

He buscado información en todos lados y no he encontrado la solucion, agradecería mucho a cualquiera que me echara una mano.

gracias adelantadas.

daltomi

  • Nuevo Miembro
  • *
  • Mensajes: 19
    • Ver Perfil
Re: Usar Una Dll
« Respuesta #1 en: Sábado 21 de Julio de 2007, 01:56 »
0
Un ejemplo de implementación "más correcto" seria:
Código: Text
  1.  
  2. //lo tengo implementado en una clase asi que lo voy cortando.
  3.  
  4. #define PROC(s) GetProcAddress(m_hmodule,(s))
  5. ....
  6. HMODULE m_hmodule;
  7. .....
  8. //como ves no defino el nombre de las variables.
  9. INT (APIENTRY* m_pCompress)(HCOMPRESSOR,PBYTE,UINT,PBYTE*,UINT);
  10. .....
  11. // obtenemos la dir de la func
  12. m_pCompress = INT(APIENTRY*)(HCOMPRESSOR,PBYTE,UINT,PBYTE*,UINT))PROC(("CompressText"));
  13. ....
  14. //usamos la fuc
  15. iret = m_pCompress(m_hcompress,pData,lsize,&pbData,USE_DEFAULT);
  16. ....
  17. //no te olvides de liberar.
  18. FreeLibrary(m_hmodule);
  19.  
  20.  
No se cual es especificamente el error de tu código, pero espero que si lo implementas de esta manera puedas solucionar tu probema. saludos.

juancayuso

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
Re: Usar Una Dll
« Respuesta #2 en: Sábado 21 de Julio de 2007, 11:52 »
0
Ok, gracias Daltomi lo veré más despacio a ver si me soluciona los problemas
gracias.
Una cosa más, cuando hallo el handle de una ventana, me devuelve uno distinto cada vez que lo hago, no se si debería devolver siempre el mismo, como cuando caragas la dll que siempre devuelve el mismo.

thank!

daltomi

  • Nuevo Miembro
  • *
  • Mensajes: 19
    • Ver Perfil
Re: Usar Una Dll
« Respuesta #3 en: Sábado 21 de Julio de 2007, 21:21 »
0
Hola.
Cita de: ""juancayuso""
Una cosa más, cuando hallo el handle de una ventana, me devuelve uno distinto cada vez que lo hago,
Según documentación, la mejor forma de obtener el controlador de la ventana, en modo consola, es asi:

1-Tomar el titulo actual de tu ventana/aplicación.
2-Crear un nombre único en el sistema(uniquetitle)
3-Ingresar ese nombre único a tu ventana/aplicación.
4-Utilizar FindWindow para obtener el controlador de la ventana, utilizando el nombre único como parámetro.
5-Restaurar el titulo de tu ventana/aplicación.

Código: Text
  1.  
  2. HWND GetConsoleHwnd(void)
  3. {
  4.     #define MY_BUFSIZE 1024 // buffer size for console window titles
  5.     HWND hwndFound;         // this is what is returned to the caller
  6.  
  7.     char pszNewWindowTitle[MY_BUFSIZE]; // contains fabricated WindowTitle
  8.     char pszOldWindowTitle[MY_BUFSIZE]; // contains original WindowTitle
  9.  
  10.     // fetch current window title
  11.  
  12.     GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);
  13.  
  14.     // format a "unique" NewWindowTitle
  15.  
  16.     wsprintf(pszNewWindowTitle,"%d/%d",
  17.                 GetTickCount(),
  18.                 GetCurrentProcessId());
  19.  
  20.     // change current window title
  21.  
  22.     SetConsoleTitle(pszNewWindowTitle);
  23.  
  24.     // ensure window title has been updated
  25.  
  26.     Sleep(40);
  27.  
  28.     // look for NewWindowTitle
  29.  
  30.     hwndFound=FindWindow(NULL, pszNewWindowTitle);
  31.  
  32.     // restore original window title
  33.  
  34.     SetConsoleTitle(pszOldWindowTitle);
  35.  
  36.     return(hwndFound);
  37. }
  38.  
  39. // Additional reference words: 3.10 3.50 4.00 95
  40. // KBCategory: kbprg kbcode
  41. // KBSubcategory: BseCon UsrWndw
  42.  
  43.  
Aún asi, se aclara lo siguiente:

The resulting HWND is not guaranteed to be suitable for all window handle
operations.

Saludos. :hola:

juancayuso

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
Re: Usar Una Dll
« Respuesta #4 en: Martes 24 de Julio de 2007, 18:01 »
0
Gracias de nuevo Daltomi,yo estoy trabajando con Builder c++, y los ejemplos que he visto lo hacen más sencillo, sólo con Findwindow(), y pasando como paraetro la clase a la que pretenece la ventana y el caption de la ventana,

pregunto esto de builder aquí porque en el apartado del foro de Builder no me responden,

ahora voy a intentar hacer unas hebras para que se ejecute paralelamente al programa principal, que tambien me están dando problemas,
Si controlas de hebras o de GetMessage para que una ventana recibe un mensage en builder contesta si no es mucha molestia y pongo aquí mis dudas,

Gracias,saludos
 :kicking: