Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2011, 13:52   #11
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вылетает?
с какой ошибкой?
отладчиком проходили?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.07.2011, 14:02   #12
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

все просто:
достаточно работы с мьютексом(не однократно давали код. Однако не правильно использовали).

Код:
var
 hM:THandle;

function IsTwoInstance(aMutexName:String):boolean;
begin
  hM:=OpenMutex(MUTEX_ALL_ACCESS,False,PChar(aMutexName));
  Result:=(hM <> 0);
  if (hM = 0) then
  hM:=CreateMutex(nil,False,PChar(aMutexName));
end;

Если я правильно понял ваше "Вылетает", в смысле мгновенно закрывается, то:
в консольке(begin end) делаем так:
Код:
if IsTwoInstance('SomeName') then
begin
  Writeln('This is a copy');
  ReadLn;
end else
begin
  Writeln('To be continue...');
  ReadLn;
end;
Результат:

Последний раз редактировалось Человек_Борща; 05.07.2011 в 14:25.
Человек_Борща вне форума Ответить с цитированием
Старый 05.07.2011, 14:05   #13
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Да и зачем ради 5 строк кода тащить windows в dpr?
он все равно тащится в итоге.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.07.2011, 14:13   #14
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> а с кодом - вылетает

ошибка у вас, я вот только что убрал {$APPTYPE CONSOLE } и убрал WriteLn(), всё прекрасно работает. Как именно вылетает? что пишет?

> Однако не правильно использовали

пример от Человек_Борща имеет ненулевую вероятность запустить 2 или более копий. Может пора уже начать правильно использовать? )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 05.07.2011, 14:20   #15
Lauri
Форумчанин
 
Регистрация: 01.04.2010
Сообщений: 171
По умолчанию

veniside
Код:
 if ( (ERROR_ALREADY_EXISTS = GetLastError()) or (ERROR_ACCESS_DENIED  = GetLastError()) ) then begin
тут останавливается нормально, а на строке
Код:
if (0 <> f_m) then CloseHandle(f_m);
уже вылетает(((


Человек_Борща у меня нету окна консольного приложения, я убра строку {$apptype console} .

Последний раз редактировалось Lauri; 05.07.2011 в 14:36.
Lauri вне форума Ответить с цитированием
Старый 05.07.2011, 14:44   #16
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
Человек_Борща у меня нету окна консольного приложения, я убра строку {$apptype console} .
Молодец. Компилятор не получил указания о том, что за приложение ты пишешь.
Если ${APPTYPE CONSOLE}
Компилятор назнает поток ввода/вывода.
Если ${APPTYPE GUI}
то там уже общение с системой через сообщения.

А если нет ни того ни другого. То весь ввод/вывод ложится на программиста в целом.
Ввод делается при загрузке нсастроек из файлов. (В run-time ты не сможешь ничего вводить(Поток ввода отсутствует).
Ну разве что сам можешь его реализовать.)
Вывод делается в лог-файл.

Ну вообще тут только твоя фантазия, и работает. Я подсказал сымые простые методы.
Если хочешь чтобы работало без ${APPTYPE CONSOLE}, пиши в лог. А про Write/Read можешь забыть.

Последний раз редактировалось Человек_Борща; 05.07.2011 в 14:50.
Человек_Борща вне форума Ответить с цитированием
Старый 05.07.2011, 15:05   #17
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> А если нет ни того ни другого. То весь ввод/вывод ложится на программиста в целом.

боже, что за бред. Если явно не указан тип приложения, то по-умолчанию он GUI.

> уже вылетает(((

хм, странно это. Ну убери эту строчку, хендл и так закроется сам, в принципе. Не думаю, что в этой строке проблема, но попробуй.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 05.07.2011, 15:35   #18
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Человек_Борща
из обычных типов приложения есть лишь два типа, это консольное, которое сразу получает хендлы потоков STDIN,STDOUT,STDERR.
и оконное, которое их не получает(хотя и может получить, но само, по запросу(ну или есть кто передаст при создании)), при этом оконное не обязано иметь окон, но оно и не имеет автоматического консольного окна.
а функции Write/Read без указания файла, работают именно с STDIN и STDOUT.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.07.2011, 15:48   #19
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Нужно было вам тему по другому назвать
не
Цитата:
Запретить второй запуск программы. Приложение без окон
а назвать наверное так:
Цитата:
Запретить второй запуск программы в консольном приложении.
Хотя функция запрета второго запуска должна работать в любых проектах.

Приложение без окон это другое понятие. Это работа в фоновом режиме.

Небольшой пример как можно работать без окон, именно в ресурсе проекта очищаешь все кроме названия и пишешь примерно так:

Код:
program Project1;

uses
//Здесь может быть прописан ваш созданный юнит
  windows;

{$R *.res}

 var
  HM: THandle;
AMsg: TMsg;

//Ваша процедура
Procedura MainFunct;
begin
//Ваш код
end;

//Известная нам процедура запрета второго запуска
function Check: boolean;
begin
  HM := OpenMutex(MUTEX_ALL_ACCESS, false, 'MyProgram');
  Result := (HM <> 0);
  if HM = 0 then
   HM := CreateMutex(nil, false, 'MyProgram');
end;

begin
  if Check then Exit;

//А дальше ловим сообщения и не даем программе закрыться
while (GetMessage(AMsg, 0, 0, 0)) do
    begin
      //Запускаем цикл обработки сообщений
      TranslateMessage(AMsg);
   //Здесь ваши действия
   //Работаем либо с системными сообщениями 
   //Либо перенаправляем все в работу процедуры в вашем юните, который создан и прописан в uses
  //Либо здесь что то делаем
  //Либо работа с вашей процедурой MainFunct, которая прописана выше.
      DispatchMessage(AMsg);
    end;
    Halt(AMsg.wParam);
end.

Последний раз редактировалось Aliens_wolfs; 05.07.2011 в 22:14.
Aliens_wolfs вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать так чтобы приложение базы данных работала на компьютерах без установленной программы delphi? Даниил_глазко БД в Delphi 6 09.11.2010 16:26
Как запретить запуск программы на VBA Excel 2003 в Excel 2007 kovalevskivf Microsoft Office Excel 2 15.05.2009 16:47
Запуск программы без дельфи grom333 Общие вопросы Delphi 11 20.02.2009 23:59