[ Burgos @ 24.02.2005. 16:15 ] @
//Ovaj tekst je subjektivno napisan, pa me ne napadajte ako nisam u pravu (imam jako malo iskustva sa OOP)
Klase - mač sa dve oštrice. Pored svih prednosti organizovanja koda i svega ostalog, onaj koje navikao na line-after-line programiranje u BASICU, pascalu ili C-u ima velike poteškoće da nauči kako se koriste klase...

Bacio sam dosta $ za VC++ 6 da bih odradio jedan komer. projekat, a posle par dana naiđoh na problem.

Pošto sam napisao dosta koda, problem je nastao u preglednosti koda. Rekoh sebi: ajde da se malo pozabavim sa klasama... Tu počinje pakao...

Maksimalno sam pojednostavio projekat, tj. izdvojio sam jedan deo da bi mogli da mi pomognete.

hook.h:
Code:
class hook{
public:
    LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
};


hook.cpp:
Code:
#define _WIN32_WINNT 0x0400
#include "Windows.h"
#include "hooking.h"


        LRESULT CALLBACK LowLevelKeyboardProc(int nCode, 
           WPARAM wParam, LPARAM lParam) {

           BOOL fEatKeystroke = FALSE;

           if (nCode == HC_ACTION) {
              switch (wParam) {
              case WM_KEYDOWN:  case WM_SYSKEYDOWN:
              case WM_KEYUP:    case WM_SYSKEYUP: 
                 PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam;
                 fEatKeystroke = 
                    ((p->vkCode == VK_TAB) && ((p->flags & LLKHF_ALTDOWN) != 0)) ||
                    ((p->vkCode == VK_ESCAPE) && 
                    ((p->flags & LLKHF_ALTDOWN) != 0)) ||
                    ((p->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 
                     0x8000) != 0));
                 break;
              }
           }
           if(fEatKeystroke) 
                MessageBox(NULL,NULL,NULL,NULL);        
        return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam, 
                  lParam));
        }

};


main.cpp:

Code:
#define _WIN32_WINNT 0x0400
#include <Windows.h>
#include "hooking.h"
void OnTop();

int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) {


    HHOOK hhkLowLevelKybd  = SetWindowsHookEx(WH_KEYBOARD_LL, hook::LowLevelKeyboardProc, hinstExe, 0);


   MessageBox(NULL, 
      TEXT("System combination of keys is disabled.\n")
      TEXT("Click OK to terminate this application and enable combinations"),
      TEXT("Try to press ALT-TAB, CTRL-ESC or ALT-ESC!"), MB_OK);
   UnhookWindowsHookEx(hhkLowLevelKybd);

   return(0);
}

void OnTop()
{
      MessageBox(NULL, 
      TEXT("You have pressed forbiden combination!\n")
      TEXT("Click OK to close this message box"),
      TEXT("Forbiden!"), MB_OK);
}



Poruka o grešci:
Code:
--------------------Configuration: hook - Win32 Debug--------------------
Compiling...
main.cpp
c:\frogProject\ES\main.cpp(9) : error C2664: 'SetWindowsHookExA' : cannot convert
 parameter 2 from 'long (__stdcall hook::*)(int,unsigned int,long)' to 
'long (__stdcall *)(int,unsigned int,long)'
        There is no context in which this conversion is possible
Skipping... (no relevant changes detected)
hooking.cpp
Error executing cl.exe.

hook.exe - 1 error(s), 0 warning(s)
[ NastyBoy @ 24.02.2005. 17:09 ] @
I da kreira instancu "hook" klase, opet ne bi nishta postigao, shto mu i greshka kazhe.
Ili proglasi callback funkciju za "static", ili je potpuno izbaci iz klase i napravi obichnu funkciju.
U sluchaju da je proglasish za "static" u okviru klase, ne morash da kreirash instancu "hook" klase.


EDIT:

U sluchaju da je ova poruka i dalje iznad poruke filmil-a, neshto debelo ne valja oko nachina rachunanja vremena na forumu :)
[ Dragi Tata @ 24.02.2005. 17:24 ] @
NastyBoy me je pretekao sa odgovorom, ali da iskoristim priliku da apelujem na našeg prijatelja Filipa da batali ES-News da nam ne pravi haos na temama.

Uzgred, Burgose, ako ne osećaš potrebu za OO-programiranjem, jednostavno se drži proceduralnog, niko neće da te ubije zbog toga.
[ Burgos @ 24.02.2005. 17:33 ] @
Hvala vam svima mnogo....
PS Gojko bi trebao da vidi šta je sa vremenom na newsu.
[ filmil @ 24.02.2005. 17:34 ] @
Citat:
Klase - mač sa dve oštrice. Pored svih prednosti organizovanja koda i svega ostalog, onaj koje navikao na line-after-line programiranje u BASICU, pascalu ili C-u ima velike poteškoće da nauči kako se koriste klase...
To se lako rešava. Ako imaš takvog nekog u projektnom timu, bacite ga sa zgrade. ;)
Citat:

hook.h:
Code:

Code:
class hook{
 public:
 LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
 };
Ovde je problem. Nemaš nijednu instancu klase hook. Samo si definisao da postoji neki tip koji ima metod taj-i-taj, ali nisi napravio nijednu instancu. Zato ti prevodilac kaže da je tip funkcije ... (hook::*)(...) a ne samo (*)(...).

Isto kao da si uradio:

Code:
typedef struct {
     int i;
 } my_struct;
 
 
a zatim hoćeš da uradiš:

Code:
my_struct.i = 1;
 

dok je ispravno:

Code:
my_struct a;
 a.i = 1;
 

(tj. moraš da deklarišeš neku promenljivu koja će da bude tog tipa pa da na njoj operišeš).

Jel sada jasnije?

f
[ filmil @ 24.02.2005. 19:45 ] @
Citat:
NastyBoy me je pretekao sa odgovorom,
Bila je samo ilustracija šta se pokušava. Food for thought.
Citat:
ali da iskoristim priliku da apelujem na našeg prijatelja Filipa da batali ES-News da nam ne pravi haos na temama.
Bolje apeluj na upravu da ne zaboravlja da šteluje sat na računaru s bazom, ili da iskoristi NTP.

f