Форум: "Основная";
Текущий архив: 2003.05.08;
Скачать: [xml.tar.bz2];
ВнизОпределение, запущена ли программа Найти похожие ветки
← →
-= Demon =- (2003-04-24 20:10) [0]Можно ли по имени exe-файла определить, запущена ли уже программа?
← →
-= Demon =- (2003-04-24 20:12) [1]В смысле, кроме просмотра списка всех запущенных процессов...
← →
jack128 (2003-04-25 00:05) [2]Здесь когда то предлагали прикольный вариант.
h := CreateFile(Pchar("c:\test.exe"),
GENERIC_WRITE + GENERIC_READ,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if h <> INVALID_HANDLE_VALUE then
// файд запущен
Согласись врятли кто нибудь будет просматривать EXE - файл в текст редакторе -)
ЗЫ А чем просмотр всех процессов не нравиться?
← →
DeMoN-777 (2003-04-25 02:16) [3]Лучше смотри процессы!
← →
dtrn (2003-04-25 10:50) [4]Menu Project/View Source
program MyProgram;
uses
Forms,
Windows,
Messages,
SysUtils,
......
{$R *.RES}
var
hMutex: THandle;
FoundWnd: THandle;
ModuleName: string;
function EnumWndProc (hwnd: THandle;
Param: Cardinal): Bool; stdcall;
var
ClassName, WinModuleName: string;
WinInstance: THandle;
begin
Result := True;
SetLength (ClassName, 100);
GetClassName (hwnd, PChar (ClassName), Length (ClassName));
ClassName := PChar (ClassName);
if ClassName = TFormMain.ClassName then
begin
// get the module name of the target window
SetLength (WinModuleName, 200);
WinInstance := GetWindowLong (hwnd, GWL_HINSTANCE);
GetModuleFileName (WinInstance,
PChar (WinModuleName), Length (WinModuleName));
WinModuleName := PChar(WinModuleName); // adjust length
// compare module names
if WinModuleName = ModuleName then
begin
FoundWnd := Hwnd;
Result := False; // stop enumeration
end;
end;
end;
begin
HMutex := CreateMutex (nil, False, "EKAFPEMutex");
if WaitForSingleObject (hMutex, 0) <> wait_TimeOut then
begin
Application.Initialize;
.......
Application.Run;
end
else
begin
SetLength (ModuleName, 200);
GetModuleFileName (HInstance,
PChar (ModuleName), Length (ModuleName));
ModuleName := PChar (ModuleName);
EnumWindows (@EnumWndProc, 0);
if FoundWnd <> 0 then
begin
Application.MessageBox
(PChar("Program is started’, PChar("Attention’"),mb_Ok or MB_ICONWARNING);
end;
end;
end.
← →
jack128 (2003-04-25 15:10) [5]dtrn (25.04.03 10:50)
Требуется не предотвратить запуск второй копии программы, а определить запущена ли программа по заданному EXE"нику.
-= Demon =- или я не прав?
кроме просмотра процессов нечего другого не выдумаешь,
ну либо модифицировать пример dtrn, но имхо хуже ибо это просмотр окон...
← →
Александр из Минска (2003-04-25 16:14) [6]на событие FormCreate
if FileExists("1.ttt") then
begin
//прога уже запущена
//закрываешь эту прогу
end
else
begin
//не запущена
//создаешь файл 1.ttt
end;
на событие FormClose
//удаляешь файл 1.ttt
Проблема в том, что если пользователь вышел не по нормальному, тогда файл остается и прога не запустится, если его не удалить...
← →
Dms (2003-04-25 16:47) [7]
> Проблема в том, что если пользователь вышел не по нормальному,
> тогда файл остается и прога не запустится, если его не удалить...
именно поэтому применяется похожий алгоритм, но только с помощью файлов, проэцируемых в память. по закрытию всех процессов, работающих с этим файлов он АВТОМАТИЧЕСКИ уничтожается. если надо, то можно и подробнее про такое решение проблемы.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.05.08;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c