Как открывать файлы в одном и том же процессе?
.mp3 ассоциированы с проигрывателем.
Выполнение команды:
Код:
"c:\foobar2000.exe" "d:\path\file1.mp3"
Теперь выполненим команду:
Код:
"c:\foobar2000.exe" "d:\path\file2.mp3"
Как мне добиться такого поведения в своей программе?
Как получить "d:\path\file1.mp3" при первом запуске процесса мне понятно: GetCommandLineW().
Как получить "d:\path\file2.mp3"?
и тот же проигрыватель (а не новый процесс!) начнёт воспроизводить "d:pathfile2.mp3".
Как мне добиться такого поведения в своей программе?
При старте нужно смотреть, не запущена ли другая копия, тут все просто - создаете именованный объект ядра, скажем, мьютекс. При старте программы смотрите, если такой есть - значит программа уже работает. если нет - создаете.
Потом обнаружилось, что процесс уже работает, в этом случае нужно просто отправить ему имя файла, используя свой любимый способ IPC, и закрыть новый процесс. Если покопать в boost::interprocess, там есть все, что нужно, а если хочется чистый WinAPI, - просто придется писать больше текста.
Спасибо, за ответ!
Код:
wchar_t WNDCLASSNAME[] = L"WNDCLASSNAM";
wchar_t WNDCAPTION[] = L"WNDCAPTION";
int WinMain()
{
HWND dest_hwnd = FindWindowW(WNDCLASSNAME, WNDCAPTION);
if (dest_hwnd == NULL)
{
// запускается первый экземпляр программы
WNDCLASSW wndclass;
wndclass.lpszClassName = WNDCLASSNAME;
if (RegisterClassW(&wndclass) == 0) { EXIT(); }
CreateWindowExW(..., WNDCAPTION, ...);
// ...
}
else
{
// передаётся командная строка первому экземпляру программы
// а этот экземляр закрывается
COPYDATASTRUCT copydatastruct;
copydatastruct.dwData = 0;
copydatastruct.lpData = GetCommandLineW();
copydatastruct.cbData = sizeof(wchar_t) * (wcslen((wchar_t *)copydatastruct.lpData) + 1);
SendMessage(dest_hwnd, WM_COPYDATA, NULL, (LPARAM)©datastruct);
}
}
wchar_t WNDCAPTION[] = L"WNDCAPTION";
int WinMain()
{
HWND dest_hwnd = FindWindowW(WNDCLASSNAME, WNDCAPTION);
if (dest_hwnd == NULL)
{
// запускается первый экземпляр программы
WNDCLASSW wndclass;
wndclass.lpszClassName = WNDCLASSNAME;
if (RegisterClassW(&wndclass) == 0) { EXIT(); }
CreateWindowExW(..., WNDCAPTION, ...);
// ...
}
else
{
// передаётся командная строка первому экземпляру программы
// а этот экземляр закрывается
COPYDATASTRUCT copydatastruct;
copydatastruct.dwData = 0;
copydatastruct.lpData = GetCommandLineW();
copydatastruct.cbData = sizeof(wchar_t) * (wcslen((wchar_t *)copydatastruct.lpData) + 1);
SendMessage(dest_hwnd, WM_COPYDATA, NULL, (LPARAM)©datastruct);
}
}