Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2002.05.27;
Скачать: [xml.tar.bz2];

Вниз

Запуск приложения   Найти похожие ветки 

 
Ольга   (2002-02-28 17:11) [0]

Я понимаю, что вопросы по поводу проверки того, запущено приложение или нет, задавались и не раз, я облазила все, кучу всего посмотрела и перепробовала, но не получается, запускается следующая копия и все. Може надо в параметрах формы что-то задавать? Серьезно - очень много перепробовала, то что раньше в форумах было...


 
Sasha9   (2002-02-28 17:23) [1]

загляни в MS SDK про Mutex


 
Виктор Щербаков   (2002-02-28 17:29) [2]

Читала?

http://delphi.mastak.ru/articles/limit.html


 
Ольга   (2002-02-28 17:30) [3]

Спасибо попробую...
Но что-то подобное уже было...


 
I/O   (2002-02-28 20:26) [4]

program Project1;

uses
Forms,
Windows, // Обязательно!!!
Unit1 in "Unit1.pas" {Form1};

{$R *.res}

Var
MemHnd : HWND;
begin
MemHnd := CreateFileMapping(HWND($FFFFFFFF),nil,PAGE_READWRITE,0,1024,"one_file");
if GetLastError<>ERROR_ALREADY_EXISTS then
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
CloseHandle(MemHnd);
end.


 
wdr   (2002-03-01 05:52) [5]

uses Forms, Windows;
var
UniqueMapping: THandle;
begin
UniqueMapping:=CreateFileMapping($ffffffff,
nil, PAGE_READONLY, 0, 32, "MyMap");
if UniqueMapping = 0 then
begin
ShowMessage("Ошибка выделения памяти!");
Halt;
end
else if GetLastError = ERROR_ALREADY_EXISTS then begin
ShowMessage("Приложение уже запущено!");
Halt;
end;
Application.Initialize;
...
...


 
sniknik   (2002-03-02 08:37) [6]

Модуль для этих целей, главное должен быть прописан первым в списке модулей.
Примерно так.

program Convert;

uses
LimHinst in "LimHinst.pas",
Forms,
MainUnit in "MainUnit.pas";

{$R *.res}

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

и сам модуль спасибо автору.

unit LimHinst;
//****************************************************************************
//
// Author: ©2001 Vladimir G. Yudin aka y-soft
// e-mail: y-soft@mail.ru
//
// Description: Ограничение количества одновременно работающих экземпляров
// приложения.
//
// Отличие от существующих реализаций:
//
// 1. С целью исключения преждевременных инициализаций проверка
// производится в самом начале загрузки приложения, до загрузки всех модулей
// 2. Исключен возможный конфликт имен, т.к. в качестве уникального имени
// используется полный путь к исполняемому модулю
// 3. Изменением значения HinstLim можно установить любое разрешенное количество
// одновременно запущенных экземпляров приложения
// 4. Изменением WaitPause можно регулировать время ожидания
// (если установить INFINITE, то получится своеобразный вариант горячего
// резервирования)
//
// Тестировалось в WinME и WinNT 4 SP6A. Ошибки не обнаружены
//
// Usage: модуль необходимо указать ПЕРВЫМ в списке uses файла .DPR проекта
// и установить необходимые значения констант HinstLimit и WaitPause.
//
// Возможные расширения:
//
// 1. Значения HinstLimit и WaitPause хранить в INI-файле или в реестре
// 2. Значение HinstLimit менять динамически в зависимости от условий
//
// Thanks: Спасибо Юрию Зотову за указание на существование проблемы
//
// Disclaimer: Используйте совершенно свободно на свой страх и риск.
// Автор убедительно просит сообщать ему о найденных ошибках и
// внесенных усовершенствованиях.
// Всякие совпадения идей, наименований функций, процедур, переменных и
// констант считать случайными :)
//
//****************************************************************************
interface

const
//Установите необходимые значения!!!
HinstLimit = 1;
WaitPause = 50;

implementation
uses
Windows;
var
Semaphore : THandle;
SemaphoreName : array[0..255] of Char;
IncCnt : integer;

function StopLoading : boolean;
var
L,I : integer;
begin
// В качестве уникального имени семафора используем полный путь
// к исполняемому файлу приложения (по определению уникален!!!)
L := GetModuleFileName(MainInstance,SemaphoreName,SizeOf(SemaphoreName));
// В имени семафора нельзя использовать обратные слэши, поэтому
// заменяем их на прямые (или еще на что-нибудь кроме #0)
for I := 0 to L - 1 do
if SemaphoreName[I] = "\" then
SemaphoreName[I] := "/";

Semaphore := CreateSemaphore(nil,HinstLimit,HinstLimit,SemaphoreName);

Result := (Semaphore = 0) or // Если семафор не удалось создать
(WaitForSingleObject(Semaphore,WaitPause) <> WAIT_OBJECT_0); // Если семафор занят
end;

procedure ShowErrMsg;
const
PROGRAM_ALREADY_RUN = "Не дпускается повторных вызовов программы!";
begin
// Главное окно программы еще не существует, поэтому выводим MessageBox
// без владельца
MessageBox(0, PROGRAM_ALREADY_RUN, SemaphoreName, MB_ICONSTOP or MB_OK);
end;

initialization
IncCnt := 0;
if StopLoading then
begin
ShowErrMsg;
// Так как никаких инициализаций еще не производилось, то
// спокойно используем для завершения программы Halt -
// finalization все равно выполнится
halt;
end
else
IncCnt := 1;
finalization
if Semaphore <> 0 then
begin
// Обязательно явно освобождаем семафор, т.к.
// автоматически его счетчик ссылок не переустанавливается
ReleaseSemaphore(Semaphore, IncCnt, nil);
// Напоследок во избежание неожиданностей освобождаем дескриптор семафора
// (так предписывает MSDN)
CloseHandle(Semaphore);
end;
end.



 
Kettle of delphi   (2002-03-02 14:49) [7]

Вот этот код точно работает (жирным выделено то, что нужно добавить в файл проекта):

program Project1;

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

{$R *.res}

var
HM: THandle;

function Check: boolean;
begin
HM:=OpenMutex(MUTEX_ALL_ACCESS, false, "MyOwnMutex");
Result:=(HM<>0);
if HM=0 then HM:=CreateMutex(nil, false, "MyOwnMutex");
end;


begin
//Проверяем, запущено ли уже приложение:
if Check then Exit;

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


 
I/O   (2002-03-03 01:00) [8]

Ольга, есть и такой вариант:

procedure TForm1.FormCreate(Sender: TObject);
VAR
Wnd : hWnd;
buff: ARRAY [0..127] OF Char;
d:string;
begin
Application.ShowMainForm:=false;
Wnd := GetWindow(Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO BEGIN
IF IsWindowVisible(Wnd) AND
(GetWindow(Wnd, gw_Owner) = 0) AND
(GetWindowText(Wnd, buff, sizeof(buff)) <> 0)
THEN BEGIN
GetWindowText(Wnd, buff, sizeof(buff));
d:=(StrPas(buff));
if d=application.Title then
if Application.MessageBox("эта программа уже запущена"+#13+ "запустить еще одну", "предупреждение",MB_YESNO) = IDNO then
Application.Terminate;

END;
Wnd := GetWindow(Wnd, gw_hWndNext);
END;
application.ShowMainForm:=True;
end;



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2002.05.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.005 c
4-88690
Oak
2002-03-25 13:32
2002.05.27
Консольные приложения


6-88588
kvcomp
2002-03-16 01:12
2002.05.27
Соединение с Интернетом!


1-88420
Vint
2002-05-17 09:53
2002.05.27
Тип данных


1-88513
Kiril
2002-05-15 21:56
2002.05.27
Удаление файла без возможности восстановления.


3-88368
Taciturn
2002-05-02 20:25
2002.05.27
Печать записи БД





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский