Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 141

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Как по двойному щелчку открыть ассоциированный с программой файл в уже работающей программе? Спасибо!

Евгений Eklmn Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Евгений Eklmn (статус: Посетитель)
Вопрос отправлен: 26 ноября 2007, 16:37
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Feniks

Здравствуйте, Трофимов Евгений!
На сколько я понял, Вам необходимо открыть некий файл "filename.myapp" с помощью Вашей прошраммы MyApp по ассоциации при уже запущенной программе...
Для этого в Вашей программе делаете проверку на уже запущенную копию и проверку/ловушку сообщения WM_USER+<какое-нибудь число>, например 200. И уже при старте программы (копия 2) проверяете, если есть уже запущенная (копия 1), то отправить ей сообщение WM_User+200 и в качестве параметра передать полный путь к запущенному файлу "filename.myapp", затем закрываете программу (копия 2). А в ловушке сообщения получаете его, читаете путь и открываете файл "filename.myapp" в своей программе (копия 1).
Это самый простой способ, но есть и более служные.

Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 26 ноября 2007, 17:11
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 3; последнее сообщение — 27 ноября 2007, 10:51; участников в обсуждении: 2.
Feniks

Feniks (статус: Бакалавр), 26 ноября 2007, 17:24 [#1]:

А проверять копию программы можно так. В событии OnCreate пишите:
const
   AppID    = 'My Application - или метка моей программы';
var
   FileMapping           : Integer;
procedure TMainForm.FormCreate(Sender: TObject);
begin
FileMapping := CreateFileMapping($FFFFFFFF, Nil, PAGE_READONLY, 0, 1, AppID);
   If GetLastError = ERROR_ALREADY_EXISTS then
   begin
// если уже запущена программа, то выдаем сообщение или отправляем ей сообщение
      ShowMessageForm(mtShowMessageError,
                      'Ошибка загрузки',
                      'Программный комплекс уже запущен !!! Запуск второй копии программы недопускается.');
      Halt;
   end;
end;
Евгений Eklmn

Евгений Eklmn (статус: Посетитель), 26 ноября 2007, 19:18 [#2]:

А как отправить сообщение о файле и поймать его?
Генерация случайных чисел - слишком важный вопрос, чтобы оставлять его на волю случая. (Роберт Ковзю, Окриджская лаборатория)
Feniks

Feniks (статус: Бакалавр), 27 ноября 2007, 10:51 [#3]:

Думаю, данный пример Вам поможет разобраться.
Функция передачи строк (а заодно и числа) между программами через SendMessage:
Function SendString(TargetWnd, SourceWnd: THandle; N: Integer; Const S: String): Integer;
Var
CD: TCopyDataStruct;
Begin
CD.dwData := N;
CD.cbData := Length(S);
If CD.cbData = 0 Then
   CD.lpData := NIL
Else CD.lpData := @S[1];
Result := SendMessage(TargetWnd, WM_COPYDATA, SourceWnd, Integer(@CD));
End;
...
Procedure WMCopyData(Var Msg: TWMCopyData); Message WM_COPYDATA;
...
Procedure TForm1.WMCopyData(var Msg: TWMCopyData);
Var
{ Строка }
S: String;
{ Число }
N: Integer;
Begin
If (Msg.CopyDataStruct^).lpData = NIL Then S := ''; 
SetLength(S,Msg.CopyDataStruct^.cbData);
S := String((Msg.CopyDataStruct^).lpData);
N := (Msg.CopyDataStruct^).dwData;
End;

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:35
Выполнено за 0.04 сек.