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

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

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

{*******************************************************}

unit multinst;


interface


uses Forms, Windows, Dialogs, SysUtils;


const

 MI_NO_ERROR = 0;

 MI_FAIL_SUBCLASS = 1;

 MI_FAIL_CREATE_MUTEX = 2;


function GetMIError: Integer;

function InitInstance : Boolean;


implementation


uses RegWork, FileWork;


var

 UniqueAppStr : PChar;

 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

 Result := 1;

 if Msg = MessageID then begin

  if IsIconic(Application.Handle) then OpenIcon(Application.Handle)

  else SetForegroundWindow(Application.Handle);

  FileWork.LoadFileName(RegWork.RWGetParamStr1);

 end

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

end;


procedure SubClassApplication;

begin

 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;

begin

 Application.ShowMainForm := False;

 PostMessage(HWND_BROADCAST, MessageId, 0, 0);

end;


function InitInstance : Boolean;

begin

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

 if MutHandle = 0 then begin

ShowWindow(Application.Handle, SW_ShowNormal);

  Application.ShowMainForm:=True;

  DoFirstInstance;

  result := True;

 end

 else begin

  RegWork.RWSetParamStr1;

  BroadcastFocusMessage;

  result := False;

 end;

end;


initialization

begin

 UniqueAppStr := PChar(Application.ExeName);

 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.

Как Π½Π΅ Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ запуск Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ IX

YoungHacker Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

Π‘Ρ‹Π» взят ΠΈΠ· ΠΊΡƒΠ»ΠΈΠ±Ρ‹ ΠΈ Π΄ΠΎΡ€Π°Π±ΠΎΡ‚Π°Π½, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΈ ситуации ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΏΠΎ HotKey Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΌ Π½Π° ярлык, Π·Π°ΠΏΡƒΡΠΊΠ°Π»Π°ΡΡŒ Π΄Π²Π°ΠΆΠ΄Ρ‹ ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π·. Бвязано с Ρ‚Π΅ΠΌ Ρ‡Ρ‚ΠΎ поиск мутСкса ΠΈ Π΅Π³ΠΎ созданиС разнСсСны Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ ΠΏΠΎΠΊΠ° Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ мутСкс Π½Π΅ нашСлся Π½ΠΎ Π΅Ρ‰Π΅ Π½Π΅ создался Π²Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚ΠΎΠΆΠ΅ Π½Π΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ мутСкса ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ созданиС

Поиск ΠΎΠΊΠΎΠ½ ΠΈ созданиС ΠΈΡ… Π½Π°Ρ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π° Ρ‚Π΅-ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Из RxLib Ѐункция Ρ‚ΠΎΠΆΠ΅ Π½Π΅ ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ этой ситуации.

Мой Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠΆΠ΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ΅ Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ прСдоставили Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Delphi 2 ΠŸΠ°Ρ‡Π΅ΠΊΠ° (Pacheco) ΠΈ Π’Π°ΠΉΡ…Π°ΠΉΡ€Π° (Teixeira). ΠΈ находится Π² Ρ„Π°ΠΉΠ»Π΅ TPrevInstUnit. Π’ Ρ„Π°ΠΉΠ»Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ²:

begin

 //– Найти ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

 if (initinstance) then begin

  …

  Application.Initialize;

  …

  Application.CreateForm(…);

  …

  Application.Run;

 end;

end.

Π€Π°ΠΉΠ» TPrevInstUnit

unit TPrevInstUnit;


interface


uses Forms, Windows, Dialogs, SysUtils;


function InitInstance : Boolean;


implementation


const

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

                            // Но ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

var

 MessageId : Integer;

 OldWProc : TFNWndProc = Nil;

 MutHandle : THandle = 0;

 SecondExecution : Boolean = False;


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

begin

 //- Если это - сообщСниС ΠΎ рСгистрации... }

 if (Msg = MessageID) then begin

//- Ссли основная Ρ„ΠΎΡ€ΠΌΠ° ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π°

  if IsIconic(Application.Handle) then begin

//- восстанавливаСм

   Π΅Π΅Application.Restore;

  end

  else begin

//- вытаскиваСм Π½Π° ΠΏΠ΅Ρ€Π΅Π΄

   ShowWindow(Application.Handle, SW_SHOW);

   SetForegroundWindow(Application.Handle);

   Application.BringToFront;

  end;

  Result := 0;

 end

 else

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

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

end;


function InitInstance : Boolean;

var

 BSMRecipients: DWORD;

begin

 Result := False;

 //- ΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ MUTEX созданный ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΊΠΎΠΏΠΈΠ΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

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

 //- ΠœΡƒΡ‚Π΅ΠΊΡ ΡƒΠΆΠ΅ Π±Ρ‹Π» создан ?

 SecondExecution := (GetLastError = ERROR_ALREADY_EXISTS);

 if (MutHandle = 0) then begin

ShowMessage('Ошибка создания Mutex.');

  Exit;

 end;

 if Not (SecondExecution) then begin

//- Π½Π°Π·Π½Π°Ρ‡Π°Π΅ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сообщСний прилоТСния, Π° старый сохраняСм

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

  //- Ссли ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ устанавливаСм ΠΎΡˆΠΈΠ±ΠΊΡƒ

  if (OldWProc = Nil) then begin

ShowMessage('Ошибка поиска стандартного ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° сообщСний прилоТСния.');

   Exit;

  end;

  //- Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ "Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ" статус основного ΠΎΠΊΠ½Π° прилоТСния

  ShowWindow(Application.Handle, SW_ShowNormal);

  //- ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ прилоТСния

  Application.ShowMainForm := True;

  //- всС Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΌΠ°ΠΌΠ° Ρ‚Ρ€Ρ‹Π½ Ρ‚ΠΈΠ½ Ρ‚ΠΈΠ½ Ρ‚ΠΈΠ½ Ρ‚ΠΈΡ€ΠΈ Ρ‚Ρ‹Π½ Ρ‚Ρ‹Π½

  Result := True;

 end

 else begin

//- ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ статус ΠΎΠΊΠ½Π° прилоТСния "Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΉ"

  ShowWindow(Application.Handle, SW_Hide);

  //- НС ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ прилоТСния

  Application.ShowMainForm := False;

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

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

  BSMRecipients := BSM_APPLICATIONS;

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

 end;

end;


initialization

begin

 //- Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡƒΠ½ΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ строку для опознания прилоТСния

 UniqueAppStr := PChar('YoungHackerNetworkDataBaseProgramm');

 //- Π—Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² систСмС ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ сообщСниС

 MessageID := RegisterWindowMessage(UniqueAppStr);

end;


finalization

begin

 if (OldWProc <> Nil) then

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

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

 end;


end.

Как Π½Π΅ Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ запуск Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ X

Nomadic Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

FindWindow являСтся Π½Π΅ΠΏΠΎΠ»Π½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ (Ссли мСняСтся Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΎΠΊΠ½Π° ΠΈΠ»ΠΈ Ссли Π΅ΡΡ‚ΡŒ другая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° с Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏΠΎΠΌ ΠΎΠΊΠ½Π°).

Π’Ρ‚ΠΎΡ€ΠΈΡ‡Π½ΠΎ: Π­Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ.

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŒΠ΅ΠΊΡ‚Ρ‹ синхронизации Win32 API.

Π›Π΅Π½ΠΈΠ²ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сСмафоры, ΠΏΠΎΠΊΠ°ΠΆΡƒ Π½Π° ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… мутСксах (сСмафоры с двумя состояниями).

Unit OneInstance32;


interface


implementation


uses

 Forms;


var

 g_hAppMutex: THandle;


function OneInstance: boolean;

var

 g_hAppCritSecMutex: THandle;

 dw: Longint;