Форум: "Прочее";
Текущий архив: 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.059 c