| 
| 
 | Вопрос # 3 793/ вопрос открыт / | 
 |  Приветствую, уважаемые эксперты!11 часов уже пытаюсь решить вроде бы детскую проблемку =(
 Суть такова. Есть программа. MP3 плеер допустим.Им можно открывать мп3 соответственно. Но 2жды его запускать ненужно, а нужно ему передать список песен которые пытались им открыть. Запретить повторную загрузку приложения дело 10 минут было.. а вот передать данные ... пытался понять DDE - ничо не получилось ... пытался WM_COPYDATA тоже не получилось... FileMapping да как то это через чур .. особенно использовать COM... ведь можно же проще ) За раннее всем огромное спасибо ! код модуля приложения ниже.
 Приложение:Переключить в обычный режим program Player; uses  Forms, windows, SysUtils,  Messages , dialogs, Controls, classes ,  Unit1 in 'Unit1.pas' {Main}; {$R *.res}var  Mutex : THandle;   aCopyData: TCopyDataStruct;   hTargetWnd: HWND; begin  Mutex := CreateMutex(nil, False, 'MyMutex');  if Mutex = 0 then 
MessageBox(0,'Íåâîçìîæíî
ñîçäàòü
ìüþòåêñ',
'Îøèáêà',  MB_OK)  else if GetLastError = ERROR_ALREADY_EXISTS then begin end  else  begin   Application.Initialize;  Application.Title := 'Smart Light Player';  Application.CreateForm(TMain, Main);  Application.Run;end;  end.
|  |   Вопрос задал: 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™ (статус: Доктор наук), 21 февраля 2010, 12:32 [#1]:А если папка, то можно юзать функцию FolderExists(). Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |