Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘ΠΎΠ²Π΅Ρ‚Ρ‹ ΠΏΠΎ Delphi. ВСрсия 1.0.6Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 8

Автор Π’Π°Π»Π΅Π½Ρ‚ΠΈΠ½ ΠžΠ·Π΅Ρ€ΠΎΠ²

end.

РСшСниС 2

ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»Π΅Π½Π½ΠΎΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ Delphi 2 ΠŸΠ°Ρ‡Π΅ΠΊΠΎΠΉ (Pacheco) ΠΈ Π’Π°ΠΉΡ…Π°ΠΉΡ€ΠΎΠΉ (Teixeira) ΠΈ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ΅.

unit multinst;

{ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅:

 ΠΠ΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ ΠΊΠΎΠ΄ Π² исходном ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅

 if InitInstance then begin

  Application.Initialize;

  Application.CreateForm(TFrmSelProject, FrmSelProject);

  Application.Run;

 end;

 Π­Ρ‚ΠΎ всС понятно (я надСюсь)}

interface

uses Forms, Windows, Dialogs, SysUtils;

const

 MI_NO_ERROR = 0;

 MI_FAIL_SUBCLASS = 1;

 MI_FAIL_CREATE_MUTEX = 2;

{ ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ запуска прилоТСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ описанных Π½ΠΈΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. }

{ ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Ρ„Π»Π°Π³ΠΎΠ² ошибок MI_* ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ. }

function GetMIError: Integer;

Function InitInstance : Boolean;


implementation


const

 UniqueAppStr : PChar;   {Π Π°Π·Π»ΠΈΡ‡Π½ΠΎΠ΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ прилоТСния}

var

 MessageId: Integer;

 WProc: TFNWndProc = Nil;

 MutHandle: THandle = 0;

 MIError: Integer = 0;


function GetMIError: Integer;

begin

 Result:= MIError;

end;


function NewWndProc(Handle: HWND; Msg: Integer; wParam, lParam: Longint): Longint; StdCall;

begin

 { Если это – сообщСниС ΠΎ рСгистрации… }

 if Msg = MessageID then begin

  { Ссли основная Ρ„ΠΎΡ€ΠΌΠ° ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π°, восстанавливаСм Π΅Π΅ }

  { ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ фокус ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ }

  if IsIconic(Application.Handle) then begin

   Application.MainForm.WindowState:= wsNormal;

   ShowWindow(Application.Mainform.Handle, sw_restore);

  end;

  SetForegroundWindow(Application.MainForm.Handle);

 end

 { Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС посылаСм сообщСниС ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌΡƒ ΠΎΠΊΠ½Ρƒ }

 else Result:= CallWindowProc(WProc, Handle, Msg, wParam, lParam);

end;


procedure SubClassApplication;

begin

 { ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°. НСобходима, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ }

 { Application.OnMessage Π±Ρ‹Π» доступСн для использования. }

 WProc:= TFNWndProc(SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(@NewWndProc)));

 { Если происходит ошибка, устанавливаСм подходящий Ρ„Π»Π°Π³ }

 if WProc = Nil then MIError:= MIError or MI_FAIL_SUBCLASS;

end;


procedure DoFirstInstance;

begin

 SubClassApplication;

 MutHandle:= CreateMutex(Nil, False, UniqueAppStr);

 if MutHandle = 0 then

  MIError:= MIError or MI_FAIL_CREATE_MUTEX;

end;


procedure BroadcastFocusMessage;

{ ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° вызываСтся, Ссли ΡƒΠΆΠ΅ имССтся запущСнная копия Π’Π°ΡˆΠ΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. }

var

 BSMRecipients: DWORD;

begin

 { НС ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ }

 Application.ShowMainForm:= False;

 { ΠŸΠΎΡΡ‹Π»Π°Π΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ сообщСниС ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ ΠΎ нСобходимости }

 { пСрСвСсти фокус Π½Π° сСбя }

 BSMRecipients:= BSM_APPLICATIONS;

 BroadCastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE, @BSMRecipients, MessageID, 0, 0);

end;


Function InitInstance : Boolean;

begin

 MutHandle:= OpenMutex(MUTEX_ALL_ACCESS, False, UniqueAppStr);

 if MutHandle = 0 then begin

  { ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Mutex Π΅Ρ‰Π΅ Π½Π΅ создан, означая, Ρ‡Ρ‚ΠΎ Π΅Ρ‰Π΅ Π½Π΅ создано }

  { Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. }

  ShowWindow(Application.Handle, SW_ShowNormal);

  Application.ShowMainForm:=True;

  DoFirstInstance;

  result:= True;

 end else begin

  BroadcastFocusMessage;

  result:= False;

 end;

end;


initialization

begin

 UniqueAppStr:= Application.Exexname;

 MessageID:= RegisterWindowMessage(UniqueAppStr);

 ShowWindow(Application.Handle, SW_Hide);

 Application.ShowMainForm:=FALSE;

end;


finalization

begin

 if WProc <> Nil then

  { ΠŸΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² исходноС состояниС }

  SetWindowLong(Application.Handle, GWL_WNDPROC, LongInt(WProc));

end;


end.

РСшСниС 3

VAR MutexHandle:THandle;

Var UniqueKey: string;

FUNCTION IsNextInstance:BOOLEAN;

BEGIN

 Result:=FALSE;

 MutexHandle:=0;

 MutexHandle:=CREATEMUTEX(NIL,true, uniquekey);

 IF MutexHandle<>0 THEN BEGIN

  IF GetLastError=ERROR_ALREADY_EXISTS THEN BEGIN

   Result:=TRUE;

   CLOSEHANDLE(MutexHandle);

   MutexHandle:=0;

  END;

 END;

END;


begin

 CmdShow:=SW_HIDE;

 MessageId:=RegisterWindowMessage(zAppName);

 Application.Initialize;

 IF IsNextInstance THEN PostMessage(HWND_BROADCAST, MessageId,0,0)

 ELSE BEGIN

  Application.ShowMainForm:=FALSE;

  Application.CreateForm(TMainForm, MainForm);

  MainForm.StartTimer.Enabled:=TRUE;

  Application.Run;

 END;

 IF MutexHandle<>0 THEN CLOSEHANDLE(MutexHandle);

end.

Π’ MainForm Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ сообщСния

PROCEDURE TMainForm.OnAppMessage(VAR M:TMSG; VAR Ret:BOOLEAN);

BEGIN

IF M.Message=MessageId THEN BEGIN

 Ret:=TRUE;

 // ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠΊΠ½ΠΎ Π½Π°Π²Π΅Ρ€Ρ… !!!!!!!!

 END;

END;


INITIALIZATION

 ShowWindow(Application.Handle, SW_Hide);

END.

Каким ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹?

16-битная вСрсия:

uses Wintypes,WinProcs,Toolhelp,Classes,Forms;


Function WinExecAndWait(Path: string; Visibility: word): word;

var

 InstanceID: THandle;

 PathLen: integer;

begin

 { ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ строку Π² Ρ‚ΠΈΠΏ PChar }

 PathLen:= Length(Path);

 Move(Path[1],Path[0],PathLen);

 Path[PathLen]:= #00;

 { ΠŸΡ‹Ρ‚Π°Π΅ΠΌΡΡ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ }

 InstanceID:= WinExec(@Path,Visibility);

 if InstanceID < 32 then { Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ мСньшС 32 ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΎΡˆΠΈΠ±ΠΊΡƒ прилоТСния }

  WinExecAndWait:= InstanceID

 else begin

  Repeat

   Application.ProcessMessages;

  until Application.Terminated or (GetModuleUsage(InstanceID) = 0);

  WinExecAndWait:= 32;

 end;

end;

32-битная вСрсия:

function WinExecAndWait32(FileName: String; Visibility: integer):integer;

var

 zAppName:array[0..512] of char;

 zCurDir:array[0..255] of char;

 WorkDir:String;

 StartupInfo:TStartupInfo;

 ProcessInfo:TProcessInformation;

begin

 StrPCopy(zAppName,FileName);

 GetDir(0,WorkDir);

 StrPCopy(zCurDir,WorkDir);

 FillChar(StartupInfo,Sizeof(StartupInfo),#0);

 StartupInfo.cb:= Sizeof(StartupInfo);

 StartupInfo.dwFlags:= STARTF_USESHOWWINDOW;

 StartupInfo.wShowWindow:= Visibility;

 if not CreateProcess(nil,

  zAppName,                      { ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки }

  nil,                           { ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° процСсс Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² бСзопасности }

  nil,                           { ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠΎΡ‚ΠΎΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² бСзопасности }

  false,                         { Ρ„Π»Π°Π³ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° }

  CREATE_NEW_CONSOLE or          { Ρ„Π»Π°Π³ создания }

  NORMAL_PRIORITY_CLASS,

  nil,                           { ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½ΠΎΠ²ΡƒΡŽ срСду процСсса }

  nil,                           { ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° имя Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ }

  StartupInfo,                   { ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° STARTUPINFO }

  ProcessInfo) then result := –1 { ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° process_inf }

 else begin

  WaitforSingleObject(ProcessInfo.hProcess,INFINITE);

  GetExitCodeProcess(ProcessInfo.hProcess,Result);

 end;

end;

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ модуля

Π’ΠΎΡ‚ ΠΌΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. Π― использовал Π΅Π³ΠΎ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… ΠΈ смСло Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ Π΅Π³ΠΎ Π²Π°ΠΌ.

procedure TForm1.Button1Click(Sender: TObject);

var

 szFileName: array[0..49] of char;

 szModuleName: array[0..19] of char;

 iSize : integer;

begin

 StrPCopy(szModuleName, 'NameOfModule');

 iSize:= GetModuleFileName(GetModuleHandle(szModuleName), szFileName, SizeOf(szFileName));

 if iSize > 0 then ShowMessage('Имя модуля с ΠΏΠΎΠ»Π½Ρ‹ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ: ' + StrPas(szFileName))

 else ShowMessage('Имя модуля Π½Π΅ встрСчСно');

end;

Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· EXE-Ρ„Π°ΠΉΠ»Π° ΠΈΠΊΠΎΠ½ΠΊΠΈ ΠΈ рисованиС Π΅Π΅ Π² TImage.

Каким ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΈΠΊΠΎΠ½ΠΊΡƒ ΠΈΠ· EXE– ΠΈ DLL-Ρ„Π°ΠΉΠ»ΠΎΠ² (ExtractAssociatedIcon) ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Π΅Π΅ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅ Timage ΠΈΠ»ΠΈ нСбольшой области Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅?

uses ShellApi;

procedure TForm1.Button1Click(Sender: TObject);

var

 IconIndex: word;

 h: hIcon;

begin

 IconIndex:= 0;

 h:= ExtractAssociatedIcon(hInstance, 'C:\WINDOWS\NOTEPAD.EXE', IconINdex);

 DrawIcon(Form1.Canvas.Handle, 10, 10, h);

end;

Паскаль

ΠœΠ°ΡΡΠΈΠ²Ρ‹

ДинамичСскиС массивы

ΠžΡ‡Π΅Π½ΡŒ простой примСр…

Const MaxBooleans = (High(Cardinal) – $F) div sizeof(boolean);

Type

 TBoolArray = array[1..MaxBooleans] of boolean;

 PBoolArray = ^TBoolArray;

Var

 B: PBoolArray;

 N: integer;

BEGIN

 N:= 63579;