线程启动时通知对象

时间:2009-07-20 11:01:06

标签: c++ dll

我有一个对象A,当某个线程启动或死亡时,应该通知它(A :: Notify()方法) 让我们说这个线程动态加载我的一些DLL文件(我可以写它) 我相信我应该编写这个DLL的dllMain函数,但是我不知道如何从这个函数中获取对A对象的引用,所以我可以运行它的Notify()方法。
任何想法?

3 个答案:

答案 0 :(得分:1)

每个进程都会加载一次DLL。加载后,只要在进程中创建线程,就会自动调用其DllMain。假设A是全局变量,您可以执行以下操作:

  1. 首次加载DLL后,调用导出的函数,该函数将在DLL中设置指向A的全局指针
  2. 每当调用DllMain并附加线程的原因时,请通过DLL中的指针调用A.
  3. 另一种选择是在你的exe中启动一个消息循环,并将它的线程ID传递给DLL。然后,每当线程附加到DLL时,都会向消息循环发送一条消息,其中包含已创建线程的详细信息。这是一个稍微复杂的解决方案,但它将为您节省使DLL熟悉A类的需要。

答案 1 :(得分:0)

A::Notify()作为静态方法可以吗? 否则,Singleton方法可能会达到此目的。

答案 2 :(得分:0)

所以如果我理解你写的,在你的主程序中你有一个A类的实例。当你的主程序加载某些dll你想让它为那个实例调用A :: Notify吗?

据我所知,无法将其他参数传递给LoadLibrary。

如果A :: Notify可以是静态的,或者A是单例,则从exe中导出“NotifyA”方法,然后让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;
}

dll Init方法然后可以存储A实例以供日后使用。

相关问题