[bcb] Delphi InTo BCB

0

problem z grubsza przedstawia sie tak: chce przepisac program napisany w delphi na C++ i troszke go przerobic na swoje potrzeby, niby wszystko powinno dzialac, skladnia poprawna, ale nic nie dziala :/, kombinowalem ze skladnia, kodem, przezucalem deklaracje z unit1.h do konstruktora formy, potem wszystko wzucilem do public w unit1.h(cale funkcje nawet), pytalem sie googli i helpa od buildera, i dalej nic, najwiecej problemow sprawia mi hook i funkcja ZrobKomunikat, czasem nawet uda sie skompilowac bez bledow, ale i tak program nie dziala :( problem jest chyba z kodem w zaleznosci gdzie sie znajduje sypie roznymi errorami (a to blad skladni, a to ze zmienna nie istnieje, a deklaracja jest linijke wyzej, czasem linker wyzuci error ze funkcja nie istnieje, jak probuje wywolac hook'a z dll (funkcja of cors zadeklarowana) rozne roznosci) prosze o rade

p.s. wiem ze mozna zasymulowac wcisniecia klawisza za pomoca SendInput i keyb_event, ale ja potrzebuje wzucic komunikat do kolejki systemowej, a to jest chyba jedyna metoda (cos na msdn pisza ze z pomoca wh_keyb_LL i keyb_event w procedurze obslugi tego hook'a mozna, ale to sciema jakas sprawdzalem i symulacja trafia prosto na wyjscie omija kolejke systemowa )

program ktory przepisuje

Na formie powinien być komponent TEdit i TButton

type
  TKomunikatLista = class(TList)
  public
   destructor Destroy; override;
  end;

var
  KomIlosc: word ;
  Hook:Integer;
  Komunikat:TEventMsg;
  KomunikatLista: TKomunikatLista ;

destructor TKomunikatLista.Destroy;
var
  i: word;
begin
  for i := 0 to Count-1 do
  Dispose(PEventMsg(Items[i]));
  inherited Destroy;
end;

procedure ZrobKomunikat(Klawisz: byte; Komun: Cardinal);
var
  Kom: PEventMsg;
begin
  New(Kom);
  with Kom^ do begin
   message := Komun;
   paramL := Klawisz;
   paramH := MapVirtualKey(Klawisz, 0);
   time := GetTickCount;
   hwnd := 0;
  end;
  KomunikatLista.Add(Kom);
end;


function Play(Code: integer; wParam, lParam: Longint): Longint; stdcall;
begin
  case Code of
   hc_Skip: begin
    inc(KomIlosc);
  if KomunikatLista.Count<=KomIlosc then begin
  UnhookWindowsHookEx(Hook);
  KomunikatLista.Free; end
  else
  Komunikat := TEventMsg(KomunikatLista.Items[KomIlosc]^);
  Result := 0;
end;

   hc_GetNext: begin
  PEventMsg(lParam)^ := Komunikat;
  Result := 0
  end
  else
   Result := CallNextHookEx(Hook, Code, wParam, lParam);
  end;
end;

procedure Push(s:string);
var x:integer;
begin
  KomunikatLista:=TKomunikatLista.Create;
  for x:=1 to Length(s) do begin
  ZrobKomunikat(vkKeyScan(s[x]), wm_KeyDown);
  ZrobKomunikat(vkKeyScan(s[x]), wm_KeyUp);
  KomIlosc := 0;
end;
  Komunikat:=TEventMsg(KomunikatLista.Items[0]^);
  Hook:=SetWindowsHookEx(wh_JournalPlayback, Play, hInstance, 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.SetFocus;
  Push('symulacja');
end;

a tu kod w bcb (najbardziej problematycznego jego czesci )

        class  TKomunikatLista: public TList {};
        int KomIlosc;
        HHOOK hookHandle;
        HINSTANCE DllInstance;
        TEventMsg *Komunikat;
        TKomunikatLista *KomunikatLista;
void ZrobKomunikat (int Klawisz, int Komun)
{
typedef struct {
    UINT message;
    UINT paramL;
    UINT paramH;
    DWORD time;
    HWND hwnd;
} PEventMsg;
PEventMsg *Kom= new PEventMsg;
Kom->message=Komun;
Kom->paramL=Klawisz;
Kom->paramH=MapVirtualKey(Klawisz, 0);
Kom->time=GetTickCount();
Kom->hwnd=0;
KomunikatLista->Add(Kom);
        }
LRESULT CALLBACK JournalPlaybackProc( int code, WPARAM wParam, LPARAM lParam )
{
switch (code)
{
case HC_SKIP: if (KomunikatLista->Count<=KomIlosc)
{
KomIlosc++;
UnhookWindowsHookEx(hookHandle);
KomunikatLista->Free();
}
else
{
Komunikat = (PEventMsg)KomunikatLista->Items[KomIlosc];
return 0;
}
case HC_GETNEXT:
  PEventMsg(lParam)= Komunikat;
  return  0 ;
 }
  return CallNextHookEx(hookHandle,code,wParam,lParam);
                           }
bool Push()
{
  ZrobKomunikat('VK_1', WM_KEYDOWN);
  ZrobKomunikat('VK_1', WM_KEYUP);
  KomIlosc = 0;
  Komunikat=(PEventMsg)KomunikatLista->Items[0];
  hookHandle SetWindowsHookEx (WH_JOURNALPLAYBACK,JournalPlaybackProc,DllInstance,0);
  return 0;

} ;
0
void ZrobKomunikat (int Klawisz, int Komun)
{
    ...
    KomunikatLista->Add(Kom); <--- TU
}

A gdzie tworzysz KomunikatLista???

1 użytkowników online, w tym zalogowanych: 0, gości: 1