IPB

Добро пожаловать, гость ( Вход | Регистрация )

9 Страниц V  1 2 3 > »   
Reply to this topicStart new topic
> Delphi, Asm, C, WinAPI, PHP, ..., FAQ
-=CHE@TER=-
Jan 5 2007, 00:35
Сообщение #1


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



Delphi programs in API.
На английском.
Очень подробно всё описано, плюс есть исходные коды готовых юнитов.
Например SmallUtil, в котором есть все частоиспользуемые подпрограммы, и который в размере меньше, чем SysUtils (автор так утверждает - я не проверял).
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Siberian GRemlin
Jul 5 2007, 16:36
Сообщение #2


Advanced Member
***

Группа: CTPAX-X
Сообщений: 537
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



Может не в тему, но не решился создавать новую тему. Как в Delphi для указанного EXE выставить в WinXP совместимость с той или иной виндой?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jul 5 2007, 16:44
Сообщение #3


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



QUOTE(Siberian GRemlin @ Jul 5 2007, 04:36 PM) *
Может не в тему, но не решился создавать новую тему. Как в Delphi для указанного EXE выставить в WinXP совместимость с той или иной виндой?

Например так:
CODE
[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
"C:\GAMES\MYGAME\MAINFILE.EXE"="WIN95"


А вообще - поставь на .EXE какую хочешь совместимость (или там 256 цветов) и в этой ветке смотри, что за ключи будут появляться.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jul 7 2007, 16:37
Сообщение #4


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



Вопрос - кто знает, как по MUTEX'у процесса получить его путь и имя файла? Что-то типа ParamStr(0), только у другого процесса...
Суть в чём: при перезапуске моей программы, нужно чтобы она завершила свою старую копию (если есть) перед загрузкой, чтобы не убивать процесс вручную в TaskManager'е и затем снова запускать.

Для убиения процесса используется такая, вот, нелёгкая процедура (потому что TerminateProcess() оставляет иконку в трее - т.е. она просто хлопает процесс, а мне нужно, чтобы он корректно завершился):
CODE
Function EnumThreadWndProc(Handle: Cardinal; lParam: Integer): LongBool; stdcall;
Begin
  SendMessage(Handle, $0010{WM_CLOSE}, 0, 0);
  Result:=(lParam<>0);
End;

Function ProcessClose(FileName: String; bCloseAll: Boolean): Boolean;
Var
    ThreadSearch, ModuleSearch: Cardinal;
                   ThreadEntry: TThreadEntry32;
                   ModuleEntry: TModuleEntry32;
Begin
  result:=False;
  FileName:=ExtractFileName(FileName);
  ThreadSearch:=CreateToolHelp32Snapshot(TH32CS_SNAPTHREAD, 0);
  If ThreadSearch > 0 Then
    Begin
      ThreadEntry.dwSize:=SizeOf(TThreadEntry32);
      If Thread32First(ThreadSearch, ThreadEntry) Then
        Repeat
          ModuleSearch:=CreateToolHelp32Snapshot(TH32CS_SNAPMODULE, ThreadEntry.th32OwnerProcessID);
          If ModuleSearch > 0 Then
            Begin
              ModuleEntry.dwSize:=SizeOf(TModuleEntry32);
              If Module32First(ModuleSearch, ModuleEntry) Then
                Repeat
                  If lstrcmpi(PChar(ExtractFileName(ModuleEntry.szExePath)), PChar(FileName)) = 0 Then
                    Begin
                      EnumThreadWindows(ThreadEntry.th32ThreadID, @EnumThreadWndProc, Integer(bCloseAll));
                      result:=True;
                    End;
                Until (Not Module32Next(ModuleSearch, ModuleEntry)) Or (result);
              CloseHandle(ModuleSearch);
            End;
        Until (Not Thread32Next(ThreadSearch, ThreadEntry)) Or (result);
      CloseHandle(ThreadSearch);
    End;
End;


Имя файла нужно для сравнения с ModuleEntry.szExePath - вдруг, мою программу, переименовали, так что я не могу спускать в функцию ParamStr(0) от текущего процесса.
Т.е. была, скажем, программа "A1.EXE", сделали копию "A2.EXE". Теперь пускают "A1.EXE", затем "A2.EXE" - т.к. MUTEX у них один, то вторая должна как-то (т.к. имя уже не совпадает) зная только MUTEX завершить предыдущую.

Вообще, пытаюсь сделать такой алгоритм:
1) Производится попытка создать MUTEX с определённым именем
2) Если пришла ошибка GetLastError = ERROR_ALREADY_EXISTS, то убить этот процесс (корректно, как в коде выше, через посылание WM_CLOSE, иначе иконка в трее останется)

Кто-нибудь знает как или, возможно, более простой путь решения?..
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
jTommy
Jul 8 2007, 16:01
Сообщение #5


Наблюдающий
***

Группа: CTPAX-X
Сообщений: 197
Регистрация: 4-February 08
Из: деревня Москва
Пользователь №: 6
Спасибо сказали: 19 раз(а)



QUOTE(-=CHE@TER=- @ Jul 7 2007, 08:37 PM) *
Вопрос - кто знает, как по MUTEX'у процесса получить его путь и имя файла? Что-то типа ParamStr(0), только у другого процесса...
Суть в чём: при перезапуске моей программы, нужно чтобы она завершила свою старую копию (если есть) перед загрузкой, чтобы не убивать процесс вручную в TaskManager'е и затем снова запускать.
Если я правильно понял ситуация такая: загружена твоя программа, пользователь изменил, например, настройки и надо перезагрузить программу, так?

В таком случае, может-быть так: пользователь жмет "применить", программа создает mutex, запускает второй экземпляр и заканчивает работу (при завершении, в самом конце удаляет mutex). Второй экземпляр находит mutex и ждет, пока он не пропадет.

P.S.: А закрыть (корректно) процесс наверное можно, если послать ему сообщение WM_CLOSE или WM_DESTROY. В этом я не уверен - надо проверять.

P.P.S.: Кажется я вернулся smile.gif
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jul 9 2007, 12:10
Сообщение #6


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



QUOTE(jTommy @ Jul 8 2007, 04:01 PM) *
Если я правильно понял ситуация такая: загружена твоя программа, пользователь изменил, например, настройки и надо перезагрузить программу, так?
Нет, всё гораздо хуже - программа при загрузке компьютера загружается и "садится" в SystemTray. А из-за чего я делаю такую хрень с её перезагрузкой - так это из-за того, что при загрузке компа, иногда, проявляется такой баг: программа загрузилась, в процессах есть, а в трее иконки нет. Х.з. из-за чего это. Приходится её перезапускать. В принципе, если бы всё было нормально и иконка всегда появлялась, то с перезагрузкой проги бы проблем не было - я бы просто не давал запускать ещё одну копию и сразу выходил. У меня есть подозрение, что это из-за того, что я держу автозапуск "Run" в HKCU, а не в HKLM, однако, ставить программу на автозапуск для всех пользователей - тупо. Каждый сам должен выбирать нужна она ему или нет.


QUOTE(jTommy @ Jul 8 2007, 04:01 PM) *
P.S.: А закрыть (корректно) процесс наверное можно, если послать ему сообщение WM_CLOSE или WM_DESTROY. В этом я не уверен - надо проверять.
Handle'у процесса посылал WM_CLOSE - без толку. Это только формам посылать надо - как я сейчас и делаю. WM_DESTROY не пробовал.


QUOTE(jTommy @ Jul 8 2007, 04:01 PM) *
P.P.S.: Кажется я вернулся smile.gif
Welcome back! Хорошо отдохнул? (*улыбается*)
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
jTommy
Jul 9 2007, 20:09
Сообщение #7


Наблюдающий
***

Группа: CTPAX-X
Сообщений: 197
Регистрация: 4-February 08
Из: деревня Москва
Пользователь №: 6
Спасибо сказали: 19 раз(а)



QUOTE(-=CHE@TER=- @ Jul 9 2007, 04:10 PM) *
Нет, всё гораздо хуже - программа при загрузке компьютера загружается и "садится" в SystemTray. А из-за чего я делаю такую хрень с её перезагрузкой - так это из-за того, что при загрузке компа, иногда, проявляется такой баг: программа загрузилась, в процессах есть, а в трее иконки нет.
Бардак на корабле! © Попугай из Пиратов Карибского моря. smile.gif
Надо разбираться, так не должно быть.

QUOTE(-=CHE@TER=- @ Jul 9 2007, 04:10 PM) *
У меня есть подозрение, что это из-за того, что я держу автозапуск "Run" в HKCU, а не в HKLM, однако, ставить программу на автозапуск для всех пользователей - тупо. Каждый сам должен выбирать нужна она ему или нет.
Из-за этого маловероятно, но и проверить это легко - поробуй позапускать программу из HKLM.

QUOTE(-=CHE@TER=- @ Jul 9 2007, 04:10 PM) *
Handle'у процесса посылал WM_CLOSE - без толку. Это только формам посылать надо - как я сейчас и делаю. WM_DESTROY не пробовал.
Но винда как-то умудряется корректно закрывать приложения...

QUOTE(-=CHE@TER=- @ Jul 9 2007, 04:10 PM) *
Welcome back! Хорошо отдохнул? (*улыбается*)
Да я не отдыхал, лень такая жуткая навалилась, в ресурсокопании ничего не получается + комп новый собирал.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Xplorer
Jul 10 2007, 09:44
Сообщение #8


Advanced Member
***

Группа: CTPAX-X
Сообщений: 52
Регистрация: 4-February 08
Пользователь №: 8
Спасибо сказали: 30 раз(а)



QUOTE(-=CHE@TER=- @ Jul 9 2007, 04:10 PM) *
Handle'у процесса посылал WM_CLOSE - без толку. Это только формам посылать надо - как я сейчас и делаю. WM_DESTROY не пробовал.
Все сообщения посылаются только окнам (HWND). Достаточно послать WM_CLOSE только главному окну. WM_DESTROY посылает сама Windows при уничтожении окна.

QUOTE(jTommy @ Jul 10 2007, 12:09 AM) *
Но винда как-то умудряется корректно закрывать приложения...
Есть сообщения WM_QUERYENDSESSION и WM_ENDSESSION.

-=CHE@TER=-
Попробуй такой вариант:
CODE
program Project1;

uses
  Windows,
  Messages,
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

var
  Mutex: THandle;
  Wnd: hWnd;

procedure ErrHalt(const Msg: string);
begin
  MessageBox(0, PChar(Msg), 'Error', MB_ICONHAND or MB_OK);
  Halt;
end;

begin
  Mutex := OpenMutex(MUTEX_ALL_ACCESS, false, '851137EC-3D96-4EA6-817B-30969CCF477B');
  if Mutex <> 0 then
  begin
    Wnd := FindWindow('AFDF47C5-D586-47F2-8091-C6FBAEF8780A', nil);
    if Wnd = 0 then ErrHalt('Window not found');

    SendMessage(Wnd, WMU_MYCLOSE, 0, 0);

    repeat
      CloseHandle(Mutex);
      Mutex := OpenMutex(MUTEX_ALL_ACCESS, false, '851137EC-3D96-4EA6-817B-30969CCF477B');
    until Mutex = 0;
  end;

  Mutex := CreateMutex(nil, false, '851137EC-3D96-4EA6-817B-30969CCF477B');
  if Mutex = 0 then ErrHalt('CreateMutex failed');
  if GetLastError = ERROR_ALREADY_EXISTS then ErrHalt('Mutex already exists');

  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;

  CloseHandle(Mutex);
end.

CODE
unit Unit1;

interface

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

const
  WMU_MYCLOSE = WM_USER + 1;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    procedure wmuMyClose(var Msg: TMessage); message WMU_MYCLOSE;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited;

  Params.WinClassName := 'AFDF47C5-D586-47F2-8091-C6FBAEF8780A';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Label1.Caption := ParamStr(0);
  Label2.Caption := FormatDateTime('d-mm-yyyy hh:mm:ss.zzz', now);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Sleep(1000);
end;

procedure TForm1.wmuMyClose(var Msg: TMessage);
begin
  Application.Terminate;
end;

end.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jul 10 2007, 12:51
Сообщение #9


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



QUOTE(jTommy @ Jul 9 2007, 08:09 PM) *
Бардак на корабле! © Попугай из Пиратов Карибского моря. smile.gif
Надо разбираться, так не должно быть.
Угу. Я тоже так думаю. Пока что идей нет.

QUOTE(jTommy @ Jul 9 2007, 08:09 PM) *
Из-за этого маловероятно, но и проверить это легко - поробуй позапускать программу из HKLM.
Попробовал этот вариант - не помогло...

QUOTE(jTommy @ Jul 9 2007, 08:09 PM) *
Да я не отдыхал, лень такая жуткая навалилась, в ресурсокопании ничего не получается + комп новый собирал.
Ну, тоже надо. (*улыбается*)


QUOTE(Xplorer @ Jul 10 2007, 09:44 AM) *
Все сообщения посылаются только окнам (HWND). Достаточно послать WM_CLOSE только главному окну. WM_DESTROY посылает сама Windows при уничтожении окна.
А вот, кстати, интересный тогда впорос возникает - если у меня главная форма отлавливает ON_CLOSE событие и вместо закрытия сворачивается в трей - то что делать?


QUOTE(Xplorer @ Jul 10 2007, 09:44 AM) *
Есть сообщения WM_QUERYENDSESSION и WM_ENDSESSION.
Кстати, может быть тогда их попробовать? И кому их отсылать?


QUOTE(Xplorer @ Jul 10 2007, 09:44 AM) *
-=CHE@TER=-Попробуй такой вариант:
О спасибо тебе большое - работает!

Тогда сразу напрашивается пара вопросов:

1) Mutex нигде не закрывается? Это вообще хорошо? Я у себя в главном .DPR файле в конце, перед "END." делал так:
CODE
  ReleaseMutex(Handle);
  CloseHandle(Handle);

Тут тоже так делать? Или см. 2)

2) Я так понял, что программа убивается, посылкой WM_CLOSE - вопрос, а MUTEX, что-ли, передаётся той копии, которая запустилась?.. Или что вообще происходит я не понял...

3) MUTEX обязательно должен называться '851137EC-3D96-4EA6-817B-30969CCF477B' или можно своё имя сунуть?..
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Xplorer
Jul 10 2007, 13:54
Сообщение #10


Advanced Member
***

Группа: CTPAX-X
Сообщений: 52
Регистрация: 4-February 08
Пользователь №: 8
Спасибо сказали: 30 раз(а)



Я изменил код.

QUOTE(-=CHE@TER=- @ Jul 10 2007, 04:51 PM) *
А вот, кстати, интересный тогда впорос возникает - если у меня главная форма отлавливает ON_CLOSE событие и вместо закрытия сворачивается в трей - то что делать?
Смотри в коде.

QUOTE(-=CHE@TER=- @ Jul 10 2007, 04:51 PM) *
Кстати, может быть тогда их попробовать? И кому их отсылать?
Эти сообщения посылает Windows при Log off/Turn off.

QUOTE(-=CHE@TER=- @ Jul 10 2007, 04:51 PM) *
1) Mutex нигде не закрывается? Это вообще хорошо? Я у себя в главном .DPR файле в конце, перед "END." делал так:
CODE
  ReleaseMutex(Handle);
  CloseHandle(Handle);

ReleaseMutex вызывать не надо, т.к. мьютекс не был захвачен. При завершении процесса мьютекс автоматически закрывается.

QUOTE(-=CHE@TER=- @ Jul 10 2007, 04:51 PM) *
3) MUTEX обязательно должен называться '851137EC-3D96-4EA6-817B-30969CCF477B' или можно своё имя сунуть?..
Можно и своё.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jul 10 2007, 22:04
Сообщение #11


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



QUOTE(Xplorer @ Jul 10 2007, 01:54 PM) *
Я изменил код.

Смотри в коде.
Хе-хе, ты своё сообщение делаешь. В принципе, да, выход. Что-то я туплю...


QUOTE(Xplorer @ Jul 10 2007, 01:54 PM) *
ReleaseMutex вызывать не надо, т.к. мьютекс не был захвачен. При завершении процесса мьютекс автоматически закрывается.
Я просто сторонник того, что сколько памяти выделил, сколько хэндлов занял - чтобы в конце программы всё освободил... Типа, на ОС полагайся, а сам не плошай. (*улыбается*)

Кстати, а зачем в FormClose стоит Sleep(1000)?.. Это просто так или имеет какое-то важное стратегическое значение?

Ещё раз спасибо за помощь!
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jul 16 2007, 16:40
Сообщение #12


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



Думаю, тут будет полезно приводить некоторые полезные куски кода.

Вот пара из них. Handle - не обязательно какой-то элемент вашей программы - это может быть и хэндл чужой программы.

Эмулирование нажатия какой-нибудь клавиши на клавиатуре:
CODE
SendMessage(Handle, WM_KEYDOWN, VK_SPACE, 0);
SendMessage(Handle, WM_CHAR, VK_SPACE, 0);
SendMessage(Handle, WM_KEYUP, VK_SPACE, 0);

В данном случае посылается код пробела элементу с хэндлом Handle. Обратите внимание, для чтобы нажатая клавиша обработалась корректно, необходимо послать все три сообщения! Т.е. сначала что нажата клавиша пробел, затем, символ клавиши, и потом, что она отжата. Это удобно делать, например, для ListView, если нужно чтобы после удаления элемента автоматом выделился тот, на котором сейчас стоит курсор.

Эмулирование нажатия клавиши мыши реализуется по схожей схеме:
CODE
SendMessage(Handle, WM_LBUTTONDOWN, MK_LBUTTON, MAKELONG(X, Y));
SendMessage(Handle, WM_LBUTTONUP, MK_LBUTTON, MAKELONG(X, Y));

В данном случае, эмулируется нажатие на левую клавишу мышки.
X, Y - координаты точки от левого верхнего угла элемента с хэндлом Handle, где "произошло" нажатие.
Сразу скажу, что я этот код не тестировал. Хотя, по идее, он должен работать.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Siberian GRemlin
Jul 19 2007, 09:14
Сообщение #13


Advanced Member
***

Группа: CTPAX-X
Сообщений: 537
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



Извиняюсь, если не в тему (вроде это WinAPI). Хотелось бы вызывать стандартные диалоги поиска и замены текста, а также использовать их, т.е. брать искомую строку из поля ввода в этих диалогах и т.п. Как это правильно реализовать, если возможно?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jul 19 2007, 13:51
Сообщение #14


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



QUOTE(Siberian GRemlin @ Jul 19 2007, 09:14 AM) *
Извиняюсь, если не в тему (вроде это WinAP). Хотелось бы вызывать стандартные диалоги поиска и замены текста, а также использовать их, т.е. брать искомую строку из поля ввода в этих диалогах и т.п. Как это правильно реализовать, если возможно?


Делаешь:
Uses CommDlg;

тогда становятся доступны вот эти две функции:

function FindText(var FindReplace: TFindReplace): HWND; stdcall;
function ReplaceText(var FindReplace: TFindReplace): HWND; stdcall;

msdn FindText
msdn ReplaceText

Если же размер исполняемого .EXE файла не интересует, то используй модуль Dialogs - там уже готовые классы есть, типа FindDialog, ReplaceDialog.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jul 20 2007, 01:30
Сообщение #15


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



А теперь моя очередь задавать вопрос. (*улыбается*)
Кто-нибудь знает, как получить количество переданных/полученых байт подключения?

В общем суть задачи - есть некоторое Интернет-соединение, горящее в трее иконкой с двумя перемигивающимися мониторами. Так вот - там отображается значение полученых/переданных байт. Я перепробовал несколько функций из iphlpapi.dll (GetIfTable(), GetIpStatistics(), GetTcpStatistics()) - всегда либо больше, либо меньше того, что там (в трее) отображается. Кто-нибудь знает, как получить точно такое же число?

Если что, то у меня есть хэндл этого подключение - брал через RasEnumConnectionsA()/RasGetConnectStatusA().
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Xplorer
Jul 20 2007, 06:08
Сообщение #16


Advanced Member
***

Группа: CTPAX-X
Сообщений: 52
Регистрация: 4-February 08
Пользователь №: 8
Спасибо сказали: 30 раз(а)



Для 2000/XP/2003/Vista - RasGetConnectionStatistics
Для 95/98/Me - ключ HKEY_DYN_DATA
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jul 20 2007, 13:48
Сообщение #17


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



Xplorer!
RasGetConnectionStatistics - это как раз в точности то, что мне нужно было!
Большое, нет просто ГРОМАДНОЕ спасибо!
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jul 23 2007, 19:01
Сообщение #18


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



Переименовал тему - теперь тут можете обсуждать что хотите (см. название).

Всё ещё вожусь с Турком. Делать враппер для всех 101-ой функции, которые использует игра, из kernel32.dll очень и очень влом.
Киньте в меня, пожалуйста, ссылкой с доками по hook'ам или с примером, скажем, как захукать MessageBoxA() (а то я сколько в сети не нахожу - они все нерабочие; может только под 9х пашут?..)...
Вообще - есть примеры, где хук ставится нормально, через стандартные API-функции типа SetWindowsHookEx() / UnhookWindowsHookEx() ? Без записи в чужой процесс и изменения точек входа и без создания отдельной .DLL? По-человечески это вообще реально сделать? Потому что писать в чужой процесс не есть гуд из соображений конфликта с антивирями.

Собственно задача: запустить программу, чтобы она работала пока её не закрыли и перехватывала произвольную функцию (все вызовы этой функции), пусть, скажем, это будет MessageBoxA() вызванный любым процессом.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Aug 11 2007, 13:54
Сообщение #19


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



Кстати, насчёт ReadKey / KeyPressed - вот, неплохая реализация юнита CRT для Windows:
"CRT32" by FRANK ZIMMER
Там, конечно, не все процедуры / функции, но основная часть. Остальное, думаю, кто захочет сделает сам.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Apr 7 2008, 17:03
Сообщение #20


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



Вопрос ко всем - возможно ли при помощи класса TFileStream обрубить файл?
Варианты с SetEndOfFile(FS.Handle) и прочее не интересует - т.к. используется модуль Windows, а значит пример не будет мультиплатформенным.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

9 Страниц V  1 2 3 > » 
Reply to this topicStart new topic
6 чел. читают эту тему (гостей: 6, скрытых пользователей: 0)
Пользователей: 0 -

 



Упрощённая версия Сейчас: 1st November 2024 - 18:29