Приостановка экспорта DLL до запуска EXE

У кого-нибудь есть идеи о том, как сделать функцию DLL для ожидания "ввода" и как вызвать конкретный экземпляр экспорта DLL?


Я пытаюсь преобразовать службу Windows в DLL. Он содержит функцию, которая регистрирует некоторую информацию о загрузке, а затем ожидает, пока не получит указание выйти. Функциональность ведения журнала проработана, но мне нужно выяснить две проблемы.

  1. После того, как он выполняет свои основные функции, экспорт должен сидеть и ждать (как классический Press any key to continue…, но минус интерфейс)
  2. Мне нужен способ, чтобы исполняемый файл впоследствии сообщал приостановленному экземпляру, что пора выходить

Для первой проблемы я подумал о том, чтобы зацикливаться и ждать какого-то триггера, но, конечно, он не должен входить в цикл со 100%-ЦПУ, так что, возможно, WaitForSingleObject или, возможно, ожидание сообщения (например, WM_APP).

Во-вторых, я подумал о каком-то межпроцессном взаимодействии, но, надеюсь, не о чем-то таком беспорядочном, как разделяемая память или семафоры (я использовал shared-mem, семафоры, сигналы и т. Д. В Unix в универе, но это в Windows). Конечно, мне нужен способ доступа к конкретному экземпляру вызываемого экспорта.

1 ответ

Решение

Вы можете использовать CreateEvent, SetEvent и WaitForSingleObject. Если DLL была загружена исполняемым файлом, который должен сигнализировать о событии, это все, что требуется. Если это из отдельных исполняемых файлов, это только немного сложнее. Когда вы вызываете CreateEvent, создайте именованное событие. Это именованное событие может быть доступно нескольким процессам. Если это должно работать для разных пользователей, вошедших в систему, добавьте к имени "Global\" префикс, и это будет одно и то же событие для всех процессов для всех пользователей.

//in dll
HANDLE eventHandle = CreateEvent( NULL, TRUE, FALSE, "Global\\My-Unique-Trigger-Event" );
//do stuff
WaitForSingleObject( eventHandle, INFINITE);
//exit

//in executable
HANDLE eventHandle = CreateEvent( NULL, TRUE, FALSE, "Global\\My-Unique-Trigger-Event" );
SetEvent( eventHandle );
Другие вопросы по тегам