2009-07-20 7 views
2

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

+0

Точнее. кажется, что вы читаете свой вопрос о том, что часть «уведомлять» не зависит от загрузки dll. Если это так, вам просто нужно, чтобы ваш класс потоков вызывал A :: notify() (вы даете ему ссылку на A: DIP), затем загружайте свою DLL. – neuro

ответ

0

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

0

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

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

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

Второго варианта написать свой собственный LoadLibrary, что называют второй метод после длл магистрали, например

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

Библиотеки DLL Init метод может затем хранить Экземпляр для последующего.

+0

Я думаю, что объект A отсутствует в DLL, нет? – neuro

1

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

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

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

Смежные вопросы