FAQ Поиск Пользователи Группы ФотоАльбом  Регистрация Войти и проверить личные сообщения Вход
Delphi, работа с dll помогите плиз

 
Начать новую тему   Ответить на тему       Список форумов Forum.profintel.ru -> Программерский раздел
Предыдущая тема :: Следующая тема  
Автор Сообщение
Verg
Мл.Сержант


Репутация: 2    

Зарегистрирован: 29.01.2007
Сообщения: 72
Откуда: ВИЗ

СообщениеДобавлено: Сб Май 17, 2008 2:50 pm    Заголовок сообщения: Delphi, работа с dll помогите плиз Ответить с цитатой

Есть дллка с хуком, внутри одной из функций не получается присвоить значение глобальной переменной =(

library lib2;

uses
windows, messages, Controls,
SysUtils, Variants, Classes, Graphics, Forms,
Dialogs, StdCtrls, my_data;



var
theHook : THandle;
notFirst, up:boolean;
p:array[0..100] of TPoint;
EndP:integer;

procedure PaintLine(x1, y1, x2, y2:integer);
var dc : hdc;
begin
dc := GetDc(0);
MoveToEx(Dc, x1, y1, nil);
LineTo(Dc, x2, y2);
ReleaseDc(0, Dc);
end;

procedure PaintBreakLines;
var i:integer;
begin
for i:=0 to EndP-1 do
begin
PaintLine(p[i].X, p[i].Y, p[i+1].X, p[i+1].Y);
end;
end;


function MouseHook(nCode, wParam, lParam : integer) : Lresult; stdcall;
Begin
if nCode<0 then
begin
result := CallNextHookEx(theHook, nCode, wParam, lParam);
Exit;
end;

if wParam = WM_MBUTTONDOWN then up:=true;
if (wParam = WM_MBUTTONUP)and(up=true) then
begin
up:=false;
if notFirst=false then
begin
EndP:=0;
notFirst:=true;
end
else EndP:=EndP+1;
P[EndP]:=Mouse.CursorPos;
end;

Result := CallNextHookEx(theHook, nCode, wParam, lParam);
End;

procedure Start;
begin
theHook := SetWindowsHookEx(wh_mouse, @MouseHook, hInstance, 0);
if theHook = 0 then
messageBox(0,'Error!','Error!',mb_ok);
end;

procedure Remove;
begin
UnhookWindowsHookEx(theHook);
notFirst:=false;
end;

exports
Start name 'Start',
Remove name 'Remove',
PaintBreakLines name 'PaintBreakLines';
end.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Дарк
Капитан


Репутация: 31    

Зарегистрирован: 30.01.2005
Сообщения: 594


СообщениеДобавлено: Сб Май 17, 2008 5:32 pm    Заголовок сообщения: Ответить с цитатой

Ищи, как правильно хуки юзать.
Примеры есть на всех языках.

_________________
"A good programmer is someone who looks both ways before crossing a one-way street". Doug Linder
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Rumata
Мл. Лейтенант


Репутация: 44    

Зарегистрирован: 09.08.2007
Сообщения: 357


СообщениеДобавлено: Сб Май 17, 2008 6:47 pm    Заголовок сообщения: Ответить с цитатой

Рабочий пример глобальной блокировки правой кнопки мыши:
DLL
Код:
library Project2;
Uses Windows,Messages;
Var SysHook:HHook=0;

Function SysMsgProc(Code:Integer; WParam:LongInt; LParam:LongInt):LongInt; stdcall;
Var Msg:TMessage;
Begin
 IF Code=HC_ACTION then
  Case TMsg(Pointer(LParam)^).Message OF
   WM_RBUTTONDOWN,WM_RBUTTONUP,WM_RBUTTONDBLCLK: TMsg(Pointer(LParam)^).Message:=WM_NULL
   else Result:=CallNextHookEx(SysHook,Code,WParam,LParam);
  End;
end;

procedure Hook(Flag:Boolean); export; stdcall;
Begin
 IF Flag then SysHook:=SetWindowsHookEx(WH_GETMESSAGE,@SysMsgProc,HInstance,0) Else
  Begin
   UnhookWindowsHookEx(SysHook);
   SysHook:=0;
  End;
End;

exports Hook;

{$R *.res}

begin
end. 


Project
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls;

type
  MyProcType = procedure (Flag: Boolean); stdcall;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  HDLL:HWND;

implementation

{$R *.dfm}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 IF Button=mbRight then ShowMessage('Right mouse key pressed');
end;

procedure TForm1.Button1Click(Sender: TObject);
Var Hook: MyProcType;
Begin
 @Hook:=nil;
 HDLL:=LoadLibrary(PChar('project2.dll')); 
 IF HDLL>HINSTANCE_ERROR then           
  Begin
   @Hook:=GetProcAddress(HDLL,'Hook');   
   Hook(True);
  End else MessageDlg('Ошибка загрузки DLL.',mtError,[mbIgnore],0);
end;

procedure TForm1.Button2Click(Sender: TObject);
Var Hook: MyProcType;
Begin
 @Hook:=nil;
 IF HDLL>HINSTANCE_ERROR then
  Begin                                   
   @Hook:=GetProcAddress(HDLL,'Hook');   
   Hook(False);                         
  End;
End;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 Button2.Click;
end;

end. 
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Verg
Мл.Сержант


Репутация: 2    

Зарегистрирован: 29.01.2007
Сообщения: 72
Откуда: ВИЗ

СообщениеДобавлено: Вс Май 18, 2008 6:54 pm    Заголовок сообщения: Ответить с цитатой

забыл показать, где переменная не присваивается.
у меня хуки работают. Проблема в том, что в функции, на которую поставлен хук, идет занесение в массив координат курсора, но координаты не присваиваются, пытался делать это отдельной процедурой, не помогает
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
ant_man
Майор


Репутация: 28    

Зарегистрирован: 08.03.2003
Сообщения: 1187
Откуда: с ВИЗа

СообщениеДобавлено: Вт Май 20, 2008 1:27 am    Заголовок сообщения: Ответить с цитатой

Как считываешь из массива? Наверно не учел, что длл в контексте другого процесса работает.
_________________
Надо же... живу...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Verg
Мл.Сержант


Репутация: 2    

Зарегистрирован: 29.01.2007
Сообщения: 72
Откуда: ВИЗ

СообщениеДобавлено: Вт Май 20, 2008 9:10 pm    Заголовок сообщения: Ответить с цитатой

массив обьявлен в длл глобально. в функции на которую поставлен хук идет присваивание элементу массива.
В другой процедуре в длл идет использование этого массива.. эта процедура периодически вызывается в екзешнике.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Verg
Мл.Сержант


Репутация: 2    

Зарегистрирован: 29.01.2007
Сообщения: 72
Откуда: ВИЗ

СообщениеДобавлено: Вт Май 20, 2008 9:11 pm    Заголовок сообщения: Ответить с цитатой

я искал как обьявить переменные для экзешника и для длл, но не нашел =(
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Дарк
Капитан


Репутация: 31    

Зарегистрирован: 30.01.2005
Сообщения: 594


СообщениеДобавлено: Чт Май 22, 2008 2:21 am    Заголовок сообщения: Ответить с цитатой

http://support.microsoft.com/kb/125677
_________________
"A good programmer is someone who looks both ways before crossing a one-way street". Doug Linder
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему       Список форумов Forum.profintel.ru -> Программерский раздел Часовой пояс: GMT + 6
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы