Приостановка экспорта DLL до запуска EXE - PullRequest
0 голосов
/ 21 июня 2011

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

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

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

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

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

1 Ответ

1 голос
/ 21 июня 2011

Вы можете использовать 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 );
...