Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

Открыть новую тему     Написать ответ в эту тему

R3Pa4eK



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

library InnoExec;
 
uses
Windows, SysUtils;
 
var
_QUIT: Boolean;
 
{$R *.res}
 
const
  MAX_PATH              = 260;
  TH32CS_SNAPPROCESS    = $00000002;
  INVALID_HANDLE_VALUE  = -1;
  PROCESS_TERMINATE     = $0001;
  _PM_REMOVE             = 1;
  STARTF_USESHOWWINDOW  = 1;
  NORMAL_PRIORITY_CLASS = $00000020;
 
type
  TProcessEntry32 = record
    dwSize: DWORD;
    cntUsage: DWORD;
    th32ProcessID: DWORD;
    th32DefaultHeapID: DWORD;
    th32ModuleID: DWORD;
    cntThreads: DWORD;
    th32ParentProcessID: DWORD;
    pcPriClassBase: Longint;
    dwFlags: DWORD;
    szExeFile: array[0..MAX_PATH] of Char;
  end;
 
  _TMsg = record
    hWnd: HWND;
    msg: Word;
    wParam: Word;
    lParam: LongWord;
    Time: TFileTime;
    pt: TPoint;
  end;
 
  TProcessInformation = record
    hProcess: THandle;
    hThread: THandle;
    dwProcessId: DWORD;
    dwThreadId: DWORD;
  end;
 
  TStartupInfo = record
    cb: DWORD;
    lpReserved: Longint;
    lpDesktop: Longint;
    lpTitle: PChar;
    dwX: DWORD;
    dwY: DWORD;
    dwXSize: DWORD;
    dwYSize: DWORD;
    dwXCountChars: DWORD;
    dwYCountChars: DWORD;
    dwFillAttribute: DWORD;
    dwFlags: DWORD;
    wShowWindow: Word;
    cbReserved2: Word;
    lpReserved2: Byte;
    hStdInput: THandle;
    hStdOutput: THandle;
    hStdError: THandle;
  end;
 
function _CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle;
  external 'CreateToolhelp32Snapshot@kernel32.dll stdcall';
function _Process32First(hSnapshot: THandle; var lppe: TProcessEntry32): BOOL;
  external 'Process32First@kernel32.dll stdcall';
function _Process32Next(hSnapshot: THandle; var lppe: TProcessEntry32): BOOL;
  external 'Process32Next@kernel32.dll stdcall';
function _OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle;
  external 'OpenProcess@kernel32.dll stdcall';
function _TerminateProcess(hProcess: THandle; uExitCode: UINT): BOOL;
  external 'TerminateProcess@kernel32.dll stdcall';
function _CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function _PeekMessage(var lpMsg: _TMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax,
  wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
function _TranslateMessage(const lpMsg: _TMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
function _DispatchMessage(const lpMsg: _TMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';
function _CreateProcess(lpApplicationName: PChar; lpCommandLine: PChar; lpProcessAttributes, lpThreadAttributes: DWORD;
bInheritHandles: BOOL; dwCreationFlags: DWORD;
lpEnvironment: PChar; lpCurrentDirectory: PChar; const lpStartupInfo: TStartupInfo;
var lpProcessInformation: TProcessInformation): BOOL;
external 'CreateProcessA@kernel32.dll stdcall';
/////////////////////////////////////////////////////////////////
 
procedure _Application_ProcessMessages;
var
  Msg: _TMsg;
begin
  if not _PeekMessage(Msg, 0, 0, 0, _PM_REMOVE) then
    Exit;
  _TranslateMessage(Msg);
  _DispatchMessage(Msg);
end;
 
function _KillProcess(ProcessID: DWORD): Boolean;
var
  hProcess: THandle;
begin
  hProcess:= _OpenProcess(PROCESS_TERMINATE, False, ProcessID);
  Result:= _TerminateProcess(hProcess, 0);
  _CloseHandle(hProcess);
end;
 
function _ArrayCharToString(ArrayChar: array of Char): string;
var
  i: Integer;
  str: string;
begin
  for i:= 0 to MAX_PATH do
    if (ArrayChar[i]) <> #0 then
      str:= str + ArrayChar[i]
    else Break;
  Result:= str;
end;
 
function _ProcIsRunning(Process: string; ProcessID: DWORD): Boolean;
var
  Snap: THandle;
  pe32: TProcessEntry32;
begin
  Result:= False;
  if Pos('\', Process) > 0 then Process:= ExtractFileName(Process);
  Snap:= _CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if Snap = INVALID_HANDLE_VALUE then Exit;
  pe32.dwSize:= SizeOf(pe32);
  if _Process32First(Snap, pe32) then
    while _Process32Next(Snap, pe32) do
      begin
        if pe32.th32ProcessID = ProcessID then
          if (LowerCase(_ArrayCharToString(pe32.szExeFile)) = LowerCase(Process)) then
            begin
              Result:= True;
              Break;
            end;
        if _QUIT then Break;
        _Application_ProcessMessages;
      end;
  _CloseHandle(Snap);
end;
 
function _StartProc(const Filename, Params, WorkingDir: string; const ShowCmd: Word;
  TerminateChild: Boolean): Boolean;
var
  PI: TProcessInformation;
  SI: TStartupInfo;
  ProcessId: DWORD;
  ProcessName: string;
  CmdLine: string;
begin
  _QUIT:= False;
  CmdLine:= '"' + Filename + '" ' + Params;
  SI.cb:= SizeOf(SI);
  SI.dwFlags:= STARTF_USESHOWWINDOW;
  SI.wShowWindow:= ShowCmd;
  try
    Result:= _CreateProcess('', PChar(CmdLine), 0, 0, False, NORMAL_PRIORITY_CLASS,
                            '', PChar(WorkingDir), SI, PI);
  except
  end;
  if Result then
    begin
      ProcessName:= ExtractFileName(Filename);
      ProcessId:= PI.dwProcessId;
      _CloseHandle(PI.hProcess);
      _CloseHandle(PI.hThread);
      while _ProcIsRunning(ProcessName, ProcessID) do;
      if _QUIT and TerminateChild then _KillProcess(ProcessID);
    end;
end;
 
function CreateProgressInInnoSetup(const Filename, Params, WorkingDir: string;
                     const ShowCmd: Word; TerminateChild: Boolean): Boolean;
begin
Result:= _StartProc(Filename, Params, WorkingDir, ShowCmd, TerminateChild);
end;
 
Только при загрузке dll'ки выбивает ошибку. Что тут не так?
exports CreateProgressInInnoSetup;
 
begin
end.

Всего записей: 963 | Зарегистр. 15-01-2011 | Отправлено: 22:00 15-05-2011
Открыть новую тему     Написать ответ в эту тему

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru