Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];

Вниз

Вопрос про взаимодействие 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.079 c
15-1188394941
sdubaruhnul
2007-08-29 17:42
2007.09.30
Задача на оптимизацмю парковки


11-1172563692
Fregl
2007-02-27 11:08
2007.09.30
Отлов ("перехват") событий VCL приложением из KOL DLL


15-1188374949
schaps
2007-08-29 12:09
2007.09.30
Может есть у кого FastReport 2.45 ( открывает frf)


15-1188568150
Yegorchic
2007-08-31 17:49
2007.09.30
CD-ROM не хочет записывать диски


10-1136705235
Алексей Петухов
2006-01-08 10:27
2007.09.30
Свой OLE-automiation





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский