Uruchamianie programów

0

Jak wykonac jakas procedure lub uruchomic jakis program przed uruchomieniem innego programu?? Czy jest to mozliwe??

0

jest to mozliwe, a skala trudności zalezy od sposobu uruchamiania programu, przed którym ma być coś uruchomoine. powiedz jak ma się uruchamiać ten program to dostaniesz opis co nalezy zrobic.

0

Najlepiej byloby, gdyby za dowolnym uruchomieniem programu. Nie wazne czy za pomoca explorera, konsoli. Jak tak sie nie da, to wystarczy samo odpalenie z explorera.

0

no to masz 4 wyjścia: albo program który uruchamiasz będzie diałał od startu systemu, albo ręcznie go uruchamiasz, albo pidpinasz się pod execa żeby twój prog startował pierwszy, ostatnie to trochę musztarda po obiedzie, czyli wykrywaz proces z dokładnościa co do sekundy i uruchamiasz app, ale to wymaga z kolei aplikacje monitorującą

0

albo jeszcze głupi raczej pomysł ale stosowałem :> że w rejestrze pod HKCR\exefile\shell\open\command wpisujesz "nazwaprogratwego.exe "%1" "%*"" i w procedurze twojego proga wpiszesz żeby po wykonaniu procedury odpalało WinExec(ParamStr(1)+' '+ParamStr(2)...); a dokładniej

uses Registry, Windows; // i na pewno nie tylko

var s:string;
 i:byte; // byte bo i tak nikt nie da nawet 255 parametrów
 rejestr:TRegistry;
begin
 rejestr:=TRegistry.Create;
 rejestr.RootKey:=HKEY_CLASSES_ROOT;
 rejestr.OpenKey('exefile\shell\open\command',true);
 rejestr.WriteString('',Application.ExeName+' "%1" "%*"');
 rejestr.CloseKey;
 rejestr.Free;
 ShowMessage('Jesteś niemądry chłopcze uruchamiając '+ParamStr(1));
 s:='';
 for i:=1 to paramCount do s:=s+'  "'+paramStr(i)+'"';
 WinExec(s);
end;

Copyrighted :)
sposób bardzo prosty a mam pytanie jak się podpiąć pod execa 32 bitowego żeby odpalało najpierw mój program ?? [diabel] i jak wykryć czy exec jest 32 bitowy czy 16 (dos) ??
jak ktoś się spyta do czego stosowałem to oczywiście do programu monitorującego co mi robią na kompie moi współlokatorzy ;-)

0

jak wykryć czy exec jest 32 bitowy czy 16 (dos) ??

Można tak:

  1. Pobierz moduł ExeImages: http://www.jack1024.private.pl/downloads/download.php?cat=delphi&f=ExeImages.pas

  2. Do uses dodaj ExeImages

  3. Zdeklaruj typ:
    type

  TAppType = (APP_TYPE_16, APP_TYPE_32, APP_TYPE_VXD, APP_TYPE_UNKNOWN);
  1. Dodaj do swojego programu funkcję:
function CheckApp(const FileName: string): TAppType;
var
  fh, fm: THandle;
  fb: Pointer;
  DosHeader: PIMAGE_DOS_HEADER;
  NTHeader: PIMAGE_NT_HEADERS;
begin
  Result := APP_TYPE_UNKNOWN;


  fh := CreateFile(
    PChar(FileName),
    GENERIC_READ,
    FILE_SHARE_READ,
    nil,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    0);

  if fh = INVALID_HANDLE_VALUE then
  begin
    CloseHandle(fh);
    ShowMessage('Could not open: "' + FileName + '"');
    Exit;
  end;

  fm := CreateFileMapping(fh, nil, PAGE_READONLY, 0, 0, nil);
  if fm = 0 then
  begin
    CloseHandle(fm);
    CloseHandle(fh);
    ShowMessage('CreateFileMapping failed !');
    Exit;
  end;

  fb := MapViewOfFile(fm, FILE_MAP_READ, 0, 0, 0);
  if fb = nil then
  begin
    UnMapViewOfFile(fb);
    CloseHandle(fm);
    CloseHandle(fh);
    ShowMessage('MapViewOfFile failed !');
    Exit;
  end;

  DosHeader := PIMAGE_DOS_HEADER(fb);

  if not DosHeader.e_magic = IMAGE_DOS_SIGNATURE then
  begin
    UnMapViewOfFile(fb);
    CloseHandle(fm);
    CloseHandle(fh);
    Result := APP_TYPE_UNKNOWN;
    Exit;
  end;
  Result := APP_TYPE_16;


  NTHeader := PIMAGE_NT_HEADERS(Longint(DosHeader) + DosHeader.e_lfanew);

  if IsBadReadPtr(NTHeader, SizeOf(IMAGE_NT_HEADERS)) then
  begin
    UnMapViewOfFile(fb);
    CloseHandle(fm);
    CloseHandle(fh);
    Exit;
  end
  else
  begin
    case NTHeader.Signature of
      IMAGE_NT_SIGNATURE: Result := APP_TYPE_32;
      IMAGE_VXD_SIGNATURE: Result := APP_TYPE_VXD;
    end;
    UnMapViewOfFile(fb);
    CloseHandle(fm);
    CloseHandle(fh);
  end;
end;

Przykładowe wywołanie:

procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
begin
  OpenDialog1.Filter := 'EXE, VXD|*.exe;*.vxd';
  if not OpenDialog1.Execute then Exit;
  case CheckApp(OpenDialog1.FileName) of
    APP_TYPE_16: s := 'Program 16 bitowy';
    APP_TYPE_32: s := 'Program 32 bitowy';
    APP_TYPE_VXD: s := 'Sterownik wirtualny VXD';
    APP_TYPE_UNKNOWN: s := '????';
  end;
  ShowMessage(s);
end;

// a co to ma do rzeczy??? - ŁF

1 użytkowników online, w tym zalogowanych: 0, gości: 1