|
Вопрос # 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. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|