Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как открывать файлы в одном и том же процессе?

1.9K
11 февраля 2019 года
strange kid
10 / / 23.02.2008
Допустим, есть аудио-проигрыватель, например, foobar2000.
.mp3 ассоциированы с проигрывателем.
Выполнение команды:
 
Код:
"c:\foobar2000.exe" "d:\path\file1.mp3"
запустит проигрыватель и он начнёт воспроизводить "d:\path\file1.mp3".
Теперь выполненим команду:
 
Код:
"c:\foobar2000.exe" "d:\path\file2.mp3"
и тот же проигрыватель (а не новый процесс!) начнёт воспроизводить "d:\path\file2.mp3".

Как мне добиться такого поведения в своей программе?
Как получить "d:\path\file1.mp3" при первом запуске процесса мне понятно: GetCommandLineW().
Как получить "d:\path\file2.mp3"?
311
15 февраля 2019 года
plastictown
309 / / 08.01.2006
Цитата:

и тот же проигрыватель (а не новый процесс!) начнёт воспроизводить "d:pathfile2.mp3".
Как мне добиться такого поведения в своей программе?

При старте нужно смотреть, не запущена ли другая копия, тут все просто - создаете именованный объект ядра, скажем, мьютекс. При старте программы смотрите, если такой есть - значит программа уже работает. если нет - создаете.

Потом обнаружилось, что процесс уже работает, в этом случае нужно просто отправить ему имя файла, используя свой любимый способ IPC, и закрыть новый процесс. Если покопать в boost::interprocess, там есть все, что нужно, а если хочется чистый WinAPI, - просто придется писать больше текста.

1.9K
16 февраля 2019 года
strange kid
10 / / 23.02.2008
Спасибо, за ответ!
1.9K
28 июля 2019 года
strange kid
10 / / 23.02.2008
Я сделал проще - без мьютекса:
Код:
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)&copydatastruct);
    }
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог