|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Не открывать вторую копию проги
Как не допустить открытия второй копии программы, и при этом, если
в ней paramcount > 0, то ети файлы запустились в уже открытой проге. Кому я должен - всем прощаю!!!! |
#2
|
||||
|
||||
Зайди в Project->>View Source и пропиши там:
Код:
в uses Forms, Windows, SysUtils; ... const MemFileSize = 1024; MemFileName = 'Имя твоей проги полностью'; var MemHnd : HWND; {$R *.RES} begin MemHnd := CreateFileMapping(HWND($FFFFFFFF), nil, PAGE_READWRITE, 0, MemFileSize, MemFileName); if GetLastError <> ERROR_ALREADY_EXISTS then begin Application.Initialize end else begin Application.MessageBox('Данная программа уже выполняется.', 'Ошибка'); halt; end; Программирование - это искусство и наш смысл жизни. Последний раз редактировалось moo2k, 08.11.2007 в 06:42. |
#3
|
||||
|
||||
Да Спасибо ОГРОМНОЕ Тебе. Я Добавил тебе отзыв.
А вот как еще файлы перекачивать на открытую? Кому я должен - всем прощаю!!!! |
#4
|
||||
|
||||
Уточни свой вопрос.
Программирование - это искусство и наш смысл жизни. Последний раз редактировалось moo2k, 01.10.2007 в 18:17. |
#5
|
||||
|
||||
if FileExists(ParamStr(1)) then ListBox1.Items.Add(ParamStr(1));
Программирование - это искусство и наш смысл жизни. |
#6
|
||||
|
||||
Не нето. Знаешь как в винампе: Кликаешь 2раза по файлу в Тотале и, если винамп уже открыт, то открывается в етом же винампе.
Кому я должен - всем прощаю!!!! |
#7
|
|||
|
|||
Использовать готовый модуль, который прописать в секции uses своего приложения и не дописывать файл проекта по 10 раз.
Код:
{ ***************************************************************************** >> Модуль для предотвращения запуска второй копии приложения с использованием объекта Mutex Применение: В исходном проекте добавить модуль MultInst в секцию Uses. ... implementation uses MultInst; ... Объект Mutex используется для синхронизации работы потоков и процессов. Несмотря на то что Mutex не поддерживает всех функциональных возможностей ожидания и работы в импульсном режиме, предоставляемых классом Monitor, он позволяет создавать именованные взаимные исключения, используемые между процессами. Для запроса на использование Mutex применяются методы WaitOne, WaitAll и WaitAny. Если объект Mutex не используется ни одним из потоков, он находится в свободном состоянии. Если Mutex используется потоком, этот поток может указывать тот же объект Mutex при повторном вызове запроса-ожидания, не прерывая выполнения. Для отказа от использования объекта Mutex его нужно освободить соответствующее количество раз. Если при использовании объекта Mutex поток был завершен обычным образом, объект Mutex переходит в свободное состояние; право на его использование получает следующий поток. Класс Mutex соответствует вызову Win32 CreateMutex. Зависимости: Forms, Windows, SysUtils; Отредактировано: Localserver Software дата: 27 мая 2007 г. ****************************************************************************** } unit MultInst; interface const MI_QUERYWINDOWHANDLE = 1; MI_RESPONDWINDOWHANDLE = 2; MI_ERROR_NONE = 0; MI_ERROR_FAILSUBCLASS = 1; MI_ERROR_CREATINGMUTEX = 2; // Call this function to determine if error occurred in startup. // Value will be one or more of the MI_ERROR_* error flags. function GetMIError: Integer; implementation uses Forms, Windows, SysUtils; const UniqueAppStr = 'MyProgramm!'; // уникальное название var MessageId: Integer; WProc: TFNWndProc; MutHandle: THandle; MIError: Integer; function GetMIError: Integer; begin Result := MIError; end; function NewWndProc(Handle: HWND; Msg: Integer; wParam, lParam: Longint): Longint; stdcall; begin Result := 0; // If this is the registered message... if Msg = MessageID then begin case wParam of MI_QUERYWINDOWHANDLE: // A new instance is asking for main window handle in order // to focus the main window, so normalize app and send back // message with main window handle. begin if IsIconic(Application.Handle) then begin Application.MainForm.WindowState := wsNormal; Application.Restore; end; PostMessage(HWND(lParam), MessageID, MI_RESPONDWINDOWHANDLE, Application.MainForm.Handle); end; MI_RESPONDWINDOWHANDLE: // The running instance has returned its main window handle, // so we need to focus it and go away. begin SetForegroundWindow(HWND(lParam)); Application.Terminate; end; end; end // Otherwise, pass message on to old window proc else Result := CallWindowProc(WProc, Handle, Msg, wParam, lParam); end; procedure SubClassApplication; begin // We subclass Application window procedure so that // Application.OnMessage remains available for user. WProc := TFNWndProc(SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(@NewWndProc))); // Set appropriate error flag if error condition occurred if WProc = nil then MIError := MIError or MI_ERROR_FAILSUBCLASS; end; procedure DoFirstInstance; // This is called only for the first instance of the application begin // Create the mutex with the (hopefully) unique string MutHandle := CreateMutex(nil, False, UniqueAppStr); if MutHandle = 0 then MIError := MIError or MI_ERROR_CREATINGMUTEX; end; procedure BroadcastFocusMessage; // This is called when there is already an instance running. var BSMRecipients: DWORD; begin // Prevent main form from flashing Application.ShowMainForm := False; // Post message to try to establish a dialogue with previous instance BSMRecipients := BSM_APPLICATIONS; BroadCastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE, @BSMRecipients, MessageID, MI_QUERYWINDOWHANDLE, Application.Handle); end; procedure InitInstance; begin SubClassApplication; // hook application message loop MutHandle := OpenMutex(MUTEX_ALL_ACCESS, False, UniqueAppStr); if MutHandle = 0 then // Mutex object has not yet been created, meaning that no previous // instance has been created. DoFirstInstance else BroadcastFocusMessage; end; initialization MessageID := RegisterWindowMessage(UniqueAppStr); InitInstance; finalization // Restore old application window procedure if WProc <> nil then SetWindowLong(Application.Handle, GWL_WNDPROC, LongInt(WProc)); if MutHandle <> 0 then CloseHandle(MutHandle); // Free mutex end. |
#8
|
||||
|
||||
А можешь сделать так: перед тем как создавать окно программы, проверяешь, существует ли оно (FindWindow), если есть, передаешь ему сообщение, в нем имя файла. А программу не окрывать. А открытая программа обрабатывает это сообщение, и добавляет этот файл в список. Если это то, что тебе нужно.
Что делать, когда сломался комп: 1. Если вы юзер - делать ноги. 2. Если ремонтник - делать деньги. 3. Если вы программист - делать вид, что так было задумано. |