Newsgroup: it.comp.programmare.win32
Titolo: Hook

Ciao vi ringrazio tanto per i vostri consigli.
Ho realizzato questa semplice DLL, per permettere di fare l'hook della
tastiera.
Quando nel programma cerco di utilizzare la seguente DLL, non riesco ad
ottenere l'indirizzo della procedura cioč:
typedef int (CALLBACK* expHookStart)();
HMODULE m_hiDll;
m_hiDll=LoadLibrary("c:\\hook.dll");
expHookStart HookStart=(expHookStart)
expHookStart HookStart=(expHookStart)
GetProcAddress((HMODULE)m_hiDll,"StartKeybHook");
Quest'ultima vaiabile ( HookStart ) č sempre NULL.
Mentre m_hiDll,  ha sempre valore 0x10000000, secondo voi č corretto?
Vi allego il codice in cui dichiaro la procedura nella DLL:
********** Hook.h ***********
WIN32_DLL_EXPORT int StartKeybHook();
********** Hook.cpp**********
WIN32_DLL_EXPORT int StartKeybHook()
{
   if (KeybHook==NULL)
   {
 /* setup hook */
 KeybHook=::SetWindowsHookEx(WH_KEYBOARD
                                    ,(HOOKPROC)KeyboardProc
                                    ,g_hiDLL
                                    ,NULL);
 if (NULL!=KeybHook)
 {
   /* problem */
   return 0;
 }
 else
 {
   /* error */
  return (int)GetLastError();
 }
   }
  /* already enable */
   return -1;
}
 ************************
Ho compilato e linkato la DLL, senza errori, non riesco perň ad accederci da
un programma esterno.
Ho provato a fare una cosa simile con altre DLL, tipo user32 ecc. e con
quelle funziona.
Come mai?
Vi ringrazio tanto.
Ciao
Maurizio

Vi allego il codice in cui dichiaro la procedura nella DLL:
Spero che il fatto che ci sia una riga duplicata sia un problema di
copia/incolla. Dunque, il fatto che l'handler della libreria sia
sempre lo stesso e' un po' strano ma possibile, se la GetProcAddress
ti torna NULL, prova a richiamare la GetLastError per ritrovare
l'errore verificatosi.
Davide

 >Mentre m_hiDll,  ha sempre valore 0x10000000, secondo voi è corretto?


Perň nella DLL la procedura č specificata.
Il fatto che sia specificata non vuole dire che sia ESPORTATA, cioe'
resa visibile dal di fuori.
Io ho sempre fatto le mie DLL usando 
__declspec( dllexport ) ..... funzione da esportare....
(in Visual C) come specificatore della funzione da esportare, non so
se tu usi un compilatore diverso ti conviene guardare nella
documentazione del compilatore stesso.
Davide

Altra prova.
Hai rgione l'handle che mi ritorna:
0x10000000 è errato perchè se metto GetLastError, subito dopo
m_hiDll=LoadLibrary("c:\\hook.dll");
ottengo l'errore:
6    The handle is invalid    ERROR_INVALID_HANDLE
Come mai?
Ho provato creare unche una DLL con il Wizard, ma ottengo sempre questo
errore.
Grazie per l'attenzione.
Ciao
Maurizio

6    The handle is invalid    ERROR_INVALID_HANDLE
Evidentemente non trova o non riesce a caricare la DLL. Verifica quale
delle due e' giusta. Se la DLL e' nel posto giusto l'unica e' che non
riesca a caricarla, a questo punto mi viene il dubbio che non sia una
DLL "giusta".
Davide

 Mentre m_hiDll,  ha sempre valore 0x10000000, secondo voi è corretto?
Si. Altrimenti LoadLibrary avrebbe tornato NULL.
Guarda **esattamente** il nome della funzione come e' esportata
potrebbe essere StartKeybHook@0 o un nome manglato (!?) dal C++.
Nel primo caso usa un alias nel .def file nel secondo
dichiarala extern "C"
Ciao
Bruno

 dichiarala extern "C"
Si puo` verificare con DUMPBIN/EXPORTS.  Il .def e` quello
che da` piu` tranquillita`, ma serve ANCHE la extern "C".
Alex