уведомить объект при запуске потока - PullRequest
2 голосов
/ 20 июля 2009

У меня есть объект A, о котором нужно уведомить (метод A :: Notify ()), когда какой-либо поток запускается или умирает.
Допустим, этот поток динамически загружает какой-то мой DLL-файл (я могу его написать).
Я считаю, что я должен написать функцию dllMain этой DLL, однако я не уверен, как получить ссылку на объект A из этой функции, чтобы я мог запустить его метод Notify ().
есть идеи?

Ответы [ 3 ]

1 голос
/ 20 июля 2009

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

  1. После первой загрузки DLL вызовите экспортированную функцию, которая установит глобальный указатель на A в DLL
  2. Всякий раз, когда вызывается DllMain с причиной присоединения потока, вызывайте A через указатель, который есть в DLL.

Другой вариант - запустить цикл обработки сообщений в вашем exe-файле и передать его идентификатор потока в DLL. Затем, всякий раз, когда поток присоединяется к DLL, отправьте в цикл сообщений сообщение с подробной информацией о созданном потоке. Это немного более сложное решение, но оно избавит вас от необходимости знакомить DLL с классом A.

0 голосов
/ 20 июля 2009

Итак, если я понимаю, что вы пишете, в вашей основной программе есть экземпляр класса А. Когда ваша основная программа загружает определенные библиотеки DLL, вы хотите, чтобы она вызывала A :: Notify для этого экземпляра?

Насколько я знаю, нет способа передать дополнительный аргумент LoadLibrary.

Если A :: Notify может быть статическим или A является одноэлементным, экспортируйте метод "NotifyA" из exe, затем вызовите dll LoadLibrary ("yourexe") и вы получите GetProcAddress, чтобы получить адрес NotifyA, который Вы можете позвонить. (Да, exe-файлы могут экспортировать такие методы, как dll!)

Второй вариант - написать собственную LoadLibrary, которая вызывает второй метод после dll main, например,

HMODULE MyLoadLibrary(string dll, A *a)
{
    HMODULE module = LoadLibrary(dll.c_str())
    void (call*)(A*) = void (*)(A*)GetProcAddress(module, "Init");
    call(a);
    return module;
}

Затем метод dlls Init может сохранить экземпляр A для дальнейшего использования.

0 голосов
/ 20 июля 2009

Можно ли сделать A::Notify() статическим методом? В противном случае метод Singleton может служить цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...