Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.30;
Скачать: CL | DM;

Вниз

Вопрос про взаимодействие DLL и формы   Найти похожие ветки 

 
исследователь ©   (2007-08-12 14:13) [0]

В разделе Uses DLL-ки (используется для хука на щелчок мыши) добавил uMain (модуль, где форма). Пишу frmMain.Caption := "jjj"; (просто для проверки), заголовок не менятеся. Нет ошибок, вылетаний, ничего - но никакие объекты формы не реагируют на изменение их свойств из Dll! В чем проблема?


 
vpbar ©   (2007-08-12 14:16) [1]

Проблема в ошибке в 17 строке.


 
исследователь ©   (2007-08-12 14:17) [2]

Это намек - дай код?


 
vpbar ©   (2007-08-12 14:19) [3]

Ага.
Вообще когда я делал хуки, то в дллке никаких форм несовал. Не помню почему, видимо была причина.


 
исследователь ©   (2007-08-12 14:20) [4]

DLL:

library clickdll;

uses windows, messages, uMain;

var
   SysHook : HHOOK = 0;
function SysMsgProc(Code : Integer; wParam : Word; lParam : longint) : longint; stdcall;
begin
Result := CallNextHookEx(SysHook, Code, wParam, lParam);
if Code = HC_ACTION then
begin
 if TMsg(Pointer(lParam)^).message = WM_LBUTTONDOWN then
 begin
  bStop := True;
 end;
end;
end;

procedure RunStop(state:boolean) export;stdcall;
begin
if state then
 SysHook := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProc, HInstance, 0)
else begin
 UnhookWindowsHookEx(Syshook);
 SysHook := 0;
end;
end;

exports RunStop index 1;

begin
end.


Форма: (место, где вызываю)
procedure TfrmMain.sbClick(Sender: TObject);
begin
timer1.Enabled := not timer1.Enabled;
bStop := not bStop; // в var формы опсиано bStop:boolean=true;
RunStop(not bStop);
end;


 
исследователь ©   (2007-08-12 14:20) [5]


> дллке никаких форм несовал.

как видишь, я тоже, они ОТДЕЛЬНЫ


 
исследователь ©   (2007-08-12 14:22) [6]


> begin
>  if TMsg(Pointer(lParam)^).message = WM_LBUTTONDOWN then
>  begin
>   bStop := True;
>  end;
> end;

сорри, забыл вписать, ибо в проге затер строчку: после BStop:=true; делаю

frmMain.Caption := "jjj";


 
vpbar ©   (2007-08-12 14:28) [7]

ты хочешь глобальный хук? Тогда это не так делается. см статью тут http://www.delphimaster.ru/articles/hooks/index.html


 
исследователь ©   (2007-08-12 14:31) [8]

Такое ощущение, что я не по-русски разговаривал до этого:
при изменении свойств формы из DLL форма на это не раегирует.

Я не так сказал? Причем тут глобальный хук?


 
vpbar ©   (2007-08-12 14:33) [9]

Это я воспользовался телепортатором и попытался предположить что нужно от этой дллки. :)
А по поводу вопроса. Ща повторю и посмотрю что там. Любопытно


 
исследователь ©   (2007-08-12 14:36) [10]

Полный сорец формы давать?


 
vpbar ©   (2007-08-12 14:38) [11]

Не. Все равно данных не хватает. Код либы есть. А кто ее загружает и вызывает RunStop? Где создается frmMain ?


 
vpbar ©   (2007-08-12 14:38) [12]

>>исследователь ©   (12.08.07 14:36) [10]
Да.


 
исследователь ©   (2007-08-12 14:43) [13]

Форма (изначально прога - взятие цвета с экрана. Хук на щелчок - для остановки выбора цвета, когда он сделан)

unit uMain;

interface

uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComCtrls, StrUtils, Buttons, ExtCtrls, clipbrd;

type
 TfrmMain = class(TForm)
   ed: TEdit;
   btnToHex: TButton;
   btnToDec: TButton;
   cbOnTop: TCheckBox;
   tb: TTrackBar;
   sb: TSpeedButton;
   Timer1: TTimer;
   im: TImage;
   procedure btnToHexClick(Sender: TObject);
   procedure edKeyPress(Sender: TObject; var Key: Char);
   procedure btnToDecClick(Sender: TObject);
   procedure cbOnTopClick(Sender: TObject);
   procedure tbChange(Sender: TObject);
   procedure SystemMenu(var Msg:TMessage); message WM_SYSCOMMAND;
   procedure FormCreate(Sender: TObject);
   procedure sbClick(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
   procedure tbKeyPress(Sender: TObject; var Key: Char);
 private
   { Private declarations }
   procedure ParseString(s : string);
   procedure CreateLogWin;
 public
   { Public declarations }
 end;

var
 frmMain: TfrmMain;
 s : string;
 l : TStrings;
 xx,yy:integer;
 Wnd : HWND = 0;
 bStop: Boolean = True;
 procedure RunStop(state:boolean) stdcall;external "clickdll.dll" index 1;
implementation
const IDM_New = $C0;
{$R *.dfm}

procedure TfrmMain.btnToHexClick(Sender: TObject);
var i : Integer;
begin
s := "";
if ed.Text = "" then exit;
ParseString(ed.Text);
for i:= 0 to l.Count - 1 do
begin
 if s<>"" then s:=s+#10#13;
 s := s+l.Strings[i]+" В 16-ричной системе счисления равно ";
 s := s + IntToHex(StrToInt(l.Strings[i]), 2);
end;
ShowMessage(s);
l.Free;
CreateLogWin;
end;

procedure TfrmMain.edKeyPress(Sender: TObject; var Key: Char);
begin
if ((not (Key in ["0".."9", ","])) and (Key <> Chr(VK_BACK))) then Key:=#0;
end;

procedure TfrmMain.btnToDecClick(Sender: TObject);
var
 i : Integer;
begin
s := "";
if ed.Text = "" then exit;
ParseString(ed.Text);
for i:= 0 to l.Count - 1 do
begin
 if s<>"" then s:=s+#10#13;
 s := l.Strings[i]+" В 10-чной системе счисления равно ";
 s := s + IntToStr(StrToInt("$"+l.Strings[i]));
end;
ShowMessage(s);
CreateLogWin;
l.Free;
end;

procedure TfrmMain.cbOnTopClick(Sender: TObject);
begin
if cbOnTop.Checked then
 frmMain.FormStyle := fsStayOnTop
else
 frmMain.FormStyle := fsNormal;
end;

procedure TfrmMain.tbChange(Sender: TObject);
begin
frmMain.AlphaBlend := True;
frmMain.AlphaBlendValue := (255 * tb.Position) div 100;

tb.Hint := "Прозрачность окна "+IntToStr(100-tb.Position)+"%";
end;

procedure TfrmMain.ParseString(s: string);
var
 i, p : Integer;
begin
 l := TStringList.Create;
 p := Pos(",", s);
 if p = 0 then begin
  l.Add(s);
  exit;
 end;
 i := 1;
 while p > 0 do
 begin
   l.Add(Copy(s, i, p-i));
   i := p + 1;
   p := PosEx(",", s, i);
 end;
 l.Add(Copy(s, i, Length(s)-i+1));
end;

procedure TfrmMain.SystemMenu(var Msg: TMessage);
begin
if msg.WParam = IDM_New then
 ShowMessage("труляля об аффтаре");
inherited;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
var
 M : HMenu;
begin
 M := GetSystemMenu(Handle, False);
 InsertMenu(M, UINT(3), MF_BYPOSITION, IDM_New, "Об авторе");
 xx:=0;
 yy:=0;
end;

procedure TfrmMain.CreateLogWin;
var
 f : TForm;
 mm : TMemo;
begin
 f := TForm.Create(Self);
 f.Width := 320;
 f.Height := 240;
 f.Top := Top;
 f.Left := Left + Width +10;
 f.Caption := "Лог";
 f.Show;
 // кпк =)) гыгы
 mm := TMemo.Create(self);
 mm.Parent := f;
 mm.Width := f.ClientWidth;
 mm.Height := f.ClientHeight;
 mm.ScrollBars := ssVertical;
 mm.Lines.Text := s;
end;

procedure TfrmMain.sbClick(Sender: TObject);
begin
timer1.Enabled := not timer1.Enabled;
bStop := not bStop;
RunStop(not bStop);
end;

procedure TfrmMain.Timer1Timer(Sender: TObject);
var
 k : TPoint;
 c : Cardinal;
begin
if bStop then
begin
 Timer1.Enabled := False;
 showmessage("stop");
 exit;
end;
c := 0;
GetCursorPos(k);
xx := k.X;
yy := k.Y;
c := GetPixel(GetDC(0), xx, yy);
if c=CLR_INVALID then showmessage("fuck!");
ed.Text :=  IntToStr(c)+ " | "+  IntToStr(GetRValue(c)) + ",";
ed.Text := ed.Text + IntToStr(GetGValue(c)) + ",";
ed.Text := ed.Text + IntToStr(GetBValue(c));
im.Canvas.Brush.Color := c;
im.Canvas.FillRect(rect(0,0,im.width,im.height));
im.Canvas.Brush.Color := $FFFFFF - c;
s := IntToHex(GetRValue(c),2)+IntToHex(GetGValue(c),2)+IntToHex(GetGValue(c),2);
im.Canvas.TextOut(im.Width div 2,0,s);
// цвет нормально еще не подобрал, пока забей
Application.ProcessMessages;
end;

procedure TfrmMain.tbKeyPress(Sender: TObject; var Key: Char);
begin
if Key=#13 then frmMain.AlphaBlend := False;
if not frmMain.AlphaBlend then
 ShowMessage("Прозрачность выключена!");
// потому что при прозрачном окне GetPixel пашет как-то криво на родном окне
end;

end.


 
vpbar ©   (2007-08-12 14:52) [14]

Так всетаки хук.
Как создается frmMain ?


 
исследователь ©   (2007-08-12 14:53) [15]

Хм... :) форму создал и все.


 
vpbar ©   (2007-08-12 14:54) [16]

Где. В дллке? Тогда эта форма будет разная для каждого процесса подгрузившего длл. См статью что я дал?


 
vpbar ©   (2007-08-12 14:56) [17]

кстати, повесил систему вставив
  MessageBox(0,"OOO","XA{A{A{A", MB_OKCANCEL);
  перед
 frmMain.bStop := True;
И три кнопки не помогли :)


 
исследователь ©   (2007-08-12 15:02) [18]


> Где. В дллке?

Мда... видимо, у тебя транслятор русского языка...того :)...


> исследователь ©   (12.08.07 14:20) [5]
>
>
> > дллке никаких форм несовал.
>
> как видишь, я тоже, они ОТДЕЛЬНЫ


 
vpbar ©   (2007-08-12 15:06) [19]

ну во первых не так уж и отдельны
>>library clickdll;
>>uses windows, messages, uMain;
Пока вижу что  frmMain используется в dll. А где она создается не вижу.

ЗЫ
> > дллке никаких форм несовал.
А как по вашему можно засунуть форму в dll.
Для меня засунуть == использовать в секции uses модуль формы.


 
исследователь ©   (2007-08-12 15:08) [20]


>  frmMain.bStop := True;

неверно.


 
исследователь ©   (2007-08-12 15:09) [21]


> А где она создается не вижу.

Б... когда дельфи стартует создается пустая форма. Намек?


> А как по вашему можно засунуть форму в dll.

в инете расписано, как. Можно.


 
vpbar ©   (2007-08-12 15:16) [22]

>>исследователь ©   (12.08.07 15:09) [21]
хм. кажется ветка - кандидат в орешник :)
>>когда дельфи стартует создается пустая форма
форма не создается. создается ее описание.
форма создается кодом в program
Application.CreateForm(TForm1, Form1);
В данном случае, если быть точным создается экземпляр класса TForm1 и присваивается переменной TForm1.
Можно еще так Form1:=TForm1.create(...);

В вашем случае я не вижу где создается экземпляр класса TfrmMain и присваивается переменной frmMain;

Надеюсь вы в курсе что запись
frmMain: TfrmMain;
означает объявление переменной с именем frmMain  и типом TfrmMain, и что переменная будет содержать мусор пока не присвоить ей значение.


 
исследователь ©   (2007-08-12 15:25) [23]

Так, я не буду ничего отвечать, про то как ты умно рассказываешь, что оказывается создается описание формы. Это так, не спорю, я лишь позволил себе выразиться неточно.

Но вот в чем дело - в инспекторе объектов я просто назвал форму из Form1 в frmMain, ты не можешь этого понять?!

program DecHex1;

uses
 Forms,
 uMain in "uMain.pas" {frmMain};

{$R *.res}

begin
 Application.Initialize;
 Application.Title := "Dec <-> Hex";
 Application.CreateForm(TfrmMain, frmMain);
 Application.Run;
end.


 
vpbar ©   (2007-08-12 15:34) [24]

Ага. Значить у нас есть еще и программа - exe.
В этой программе экземпляр TfrmMain содается и переменная frmMain - инициализируется. Это понятно. Но переменная frmMain в DecHex1 и переменная frmMain в clickdll  - это разные переменные. Несмотря на то что имя одинаково.
Собственно вопрос как и где инициализируется переменная frmMain в clickdl? Вопрос понятен?


 
исследователь ©   (2007-08-12 15:41) [25]

Теперь понятен. Ответ: нигде. Вопрос навстречу: как связать их?


 
vpbar ©   (2007-08-12 15:46) [26]

Вот. Теперь хороший вопрос. Статью ,что я дал в [7] еще не прочитали? Читайте. Это и есть ответ. Если будут вопросы по статью - задавайте. Но там в принципе все просто и пример есть.


 
исследователь ©   (2007-08-12 15:48) [27]

Так. Тогда еще вопрос - почему реагирует всего на 1 клик?


 
vpbar ©   (2007-08-12 15:51) [28]

Оно всетаки реагирует?
Лично я больше не буду отвечать пока не прочтете статью и не посмотрите примеры.
disconnect. Удачи.


 
исследователь ©   (2007-08-12 15:55) [29]

Реагирует. Я не могу понять в этой статье, где взаимодействие DLL и формы. Какой пример нужно открыть?

Ну если такие важыне, то что поделать.


 
исследователь ©   (2007-08-12 15:57) [30]

В библиотеки, находящиеся не в АП вашего процесса, можно посылать только процессо-независимые данные

Я уже понял это сам и решил сделать нажатие на кнопку вкл/выкл взятие цвета через хендлы. Но! Анализируется только один клик.


 
исследователь ©   (2007-08-12 16:11) [31]

У меня уже нервы сдают. Может, поможешь?


 
Черный Шаман   (2007-08-12 16:29) [32]


Result := CallNextHookEx(SysHook, Code, wParam, lParam);


Вызывается в конце процедуры обработки сообщений хука.

Кроме того не забывай, что каждый процесс загружает твою Dll в своё адресное пространство, так что "глобальные" данные dll в каждом процессе разные.

подключение и отключение процесса можно просмотреть в dllproc  ищи в справке delphi.


 
isasa ©   (2007-08-12 16:45) [33]

исследователь ©   (12.08.07 15:55) [29]
Может поможет мысль.
Какая связь между переменными в двух разных, независимых проектах, даже если они имеют одно имя.


 
Черный Шаман   (2007-08-12 16:53) [34]


> исследователь ©   (12.08.07 15:57) [30]
>
> В библиотеки, находящиеся не в АП вашего процесса, можно
> посылать только процессо-независимые данные
>
> Я уже понял это сам и решил сделать нажатие на кнопку вкл/выкл
> взятие цвета через хендлы. Но! Анализируется только один
> клик.


Используй сообщения для того чтобы общаться с формой:

В форме(приложении) и dll при входе в процесс регистрируешь определенной соообщение. В Dll нужно как-то передать MainFormHandle или же найти по findwidow.

WM_MY_Message := RegisterWindowMessage("My_Menu_Message_Name");


В процедуры обработки хука пишешь:

PostMessage(MainFormHandle,WM_MY_Message, Wparam, Lparam);


В форме обработчик этого сообщения через

var
 WM_MY_Message: longword = $FFFFFFFF;

type
 TForm1 = class(TForm)
 protected
   procedure WndProc(var Message: TMessage); override;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.WndProc(var Message: TMessage);
begin
 if Message.Msg = WM_MY_Message then
   ShowMessage("test");//свой обработчик
 inherited;
end;

initialization
 begin
 WM_MY_Message := WM_CHAR;//свой обработчик через RegisterWindowMessage("My_Menu_Message_Name");
 end;


 
Юрий Зотов ©   (2007-08-12 23:05) [35]

> исследователь ©   (12.08.07 16:11) [31]
> У меня уже нервы сдают. Может, поможешь?

Спокойно, парень. Ты их дожмешь. Потому что грамотно спрашиваешь. Это не шутка.

Извини, что не помогаю. По ветке видно, что ты и сам вот-вот дойдешь, поэтому не хочу портить. А САМ - это не для всех, но это ценнее.

> vpbar ©

Full respect!


 
Черный Шаман   (2007-08-12 23:36) [36]


> Юрий Зотов ©   (12.08.07 23:05) [35]


В статье ошибочка. Хук не нужно передавать начиная не только с Windows2000 а с NT 4.0. Только 9X требует передачу в CallNextHookEx дескриптора хука.

Но 9x давно мертва, разработка новых программ с поддержкой 9x смысла не имеет.


 
Юрий Зотов ©   (2007-08-13 00:39) [37]

> Черный Шаман   (12.08.07 23:36) [36]

То есть - начиная с NT 4.0 и по линейке NT разделяемая область не обязательна? Я правильно понял?


 
Черный Шаман   (2007-08-13 03:55) [38]


> Юрий Зотов ©   (13.08.07 00:39) [37]
>
> > Черный Шаман   (12.08.07 23:36) [36]
>
> То есть - начиная с NT 4.0 и по линейке NT разделяемая область
> не обязательна? Я правильно понял?


Microsoft говорит да http://msdn2.microsoft.com/en-us/library/ms644974.aspx
hhk
   [in] Windows 95/98/ME: Handle to the current hook. An application receives this handle as a result of a previous call to the SetWindowsHookEx function.

   Windows NT/XP/2003: Ignored.


 
Юрий Зотов ©   (2007-08-13 11:08) [39]

> Черный Шаман   (13.08.07 03:55) [38]

Тем не менее, получается, что ошибки в статье все же нет.


 
gawaharlal   (2007-08-29 15:01) [40]

Доброго времени суток!. Подскажи, пожалуйста, сайты, с которых можно скачать музыку альтернативных групп(рэпкор/ню/кроссовер/хк), причем желательно с прямыми ссылками и без ограничений на скачивание и бесплатно. :)
Ну, разумеется, магазины не предлагать. Знаю, что сейчас это очень редкое явление, поэтому такие сайты ценятся и ссылки на них особо не распространяются, но все же, вдруг кто решит поделиться, товарищи.



Страницы: 1 2 вся ветка

Текущий архив: 2007.09.30;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.027 c
2-1188675339
WebSQLNeederr
2007-09-01 23:35
2007.09.30
inttostr(i/100) а КАК?


1-1182945577
IntruderLab
2007-06-27 15:59
2007.09.30
Назначить горячую клавишу


15-1188389780
Галинка
2007-08-29 16:16
2007.09.30
Спасибо всем


2-1188644231
17Landgraf
2007-09-01 14:57
2007.09.30
Вопрос по поводу свойства Charset класса TFont


1-1184835519
IntruderLab
2007-07-19 12:58
2007.09.30
Вопрос по компоненту TTreeView