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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 3 793

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

Приветствую, уважаемые эксперты!
11 часов уже пытаюсь решить вроде бы детскую проблемку =(
Суть такова. Есть программа. MP3 плеер допустим.Им можно открывать мп3 соответственно. Но 2жды его запускать ненужно, а нужно ему передать список песен которые пытались им открыть. Запретить повторную загрузку приложения дело 10 минут было.. а вот передать данные ... пытался понять DDE - ничо не получилось ... пытался WM_COPYDATA тоже не получилось... FileMapping да как то это через чур .. особенно использовать COM... ведь можно же проще ) За раннее всем огромное спасибо ! код модуля приложения ниже.

Приложение:
  1. program Player;
  2.  
  3. uses
  4. Forms, windows, SysUtils, Messages , dialogs, Controls, classes ,
  5. Unit1 in 'Unit1.pas' {Main};
  6.  
  7. {$R *.res}
  8. var
  9. Mutex : THandle;
  10. aCopyData: TCopyDataStruct;
  11. hTargetWnd: HWND;
  12.  
  13. begin
  14. Mutex := CreateMutex(nil, False, 'MyMutex');
  15. if Mutex = 0 then
  16. MessageBox(0,'Íåâîçìîæíî ñîçäàòü ìüþòåêñ', 'Îøèáêà', MB_OK)
  17. else if GetLastError = ERROR_ALREADY_EXISTS then begin
  18.  
  19. end else
  20. begin
  21.  
  22. Application.Initialize;
  23. Application.Title := 'Smart Light Player';
  24. Application.CreateForm(TMain, Main);
  25. Application.Run;
  26. end;
  27. end.


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

Вопрос задал: BloodVIRUS (статус: Посетитель)
Вопрос отправлен: 20 февраля 2010, 21:30
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Не знаю, почему у тебя не получилось через WM_COPYDATA. У меня давно всё пашет через него. Щас поищу куски кода... Вот, нашёл.
Посылка данных (в файле проекта .dpr):

// Передача командной строки в первую копию программы
procedure SendCommandLine;
var
  PrevMainFormHandle: THandle; // Хэндл формы предыд. копии программы
  FileName: string;
  Len: Integer;
  Data: TCopyDataStruct; // Структура для передачи
  Buffer: array[0..MAX_PATH - 1] of Char; // Буфер для передачи
begin
  FileName:= ParamStr(1);
  Len:= Length(FileName);
 
  if not FileExists(FileName) or (Len > MAX_PATH)
    then Exit;
 
  PrevMainFormHandle:= FindWindow('TSourceEditorMainForm', nil);
 
  if PrevMainFormHandle = 0
    then Exit;
 
  FillChar(Buffer, SizeOf(Buffer), #0);
  Move(FileNAme[1], Buffer[0], Len);
  Data.dwData:= 0;
  Data.cbData:= SizeOf(Buffer);
  Data.lpData:= @Buffer;
  SendMessage(PrevMainFormHandle, WM_COPYDATA, 0, Integer(@Data));
end;
Приём данных:
procedure TSourceEditorMainForm.WmCopyData(var Msg: TWMCopyData);
var
  AFileName: string;
  Buffer: PChar;
  UserCancelled: Boolean;
begin
  // Обработчик сообщения WM_COPYDATA для принятия
  // командной строки из второй копии программы
  Buffer:= PChar(Msg.CopyDataStruct.lpData);
  AFileName:= string(Buffer);
 
  // Открытие проекта или файла
  if AnsiLowerCase(ExtractFileExt(AFileName)) = ProjectFileExt
    then ProjectTreeView.OpenProject(AFileName)
    else ProjectTreeView.OpenFile(AFileName, UserCancelled);
end;

Прежде чем копипастить код в свою программу, разберись, как он работает.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 21 февраля 2010, 09:37


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

Всего сообщений: 1; последнее сообщение — 21 февраля 2010, 12:32; участников в обсуждении: 1.
min@y™

min@y™ (статус: Доктор наук), 21 февраля 2010, 12:32 [#1]:

А если папка, то можно юзать функцию FolderExists().
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

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

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