2009-07-20 71 views
2

我有一個對象A,當某個線程啓動或死亡時應該通知對象(A :: Notify()方法)。
可以說,這個線程動態加載我的一些DLL文件(我可以寫它)。
我相信我應該寫這個DLL的dllMain函數,但是我不知道如何從這個函數中獲得對A對象的引用,所以我可以運行它的Notify()方法。
有什麼想法?線程啓動時通知對象

+0

更精確。它似乎讀取您的問題,「通知」部分是獨立於dll加載。如果這是真的,你只需要讓你的線程類調用A :: notify()(你給它一個A:DIP的引用)然後加載你的DLL。 – neuro 2009-08-10 10:00:05

回答

0

A::Notify()作爲靜態方法可以嗎? 否則,Singleton方法可能會達到目的。

0

所以如果我明白你寫的,在你的主程序中你有一個類A的實例。當你的主程序加載某些dll時,你希望它爲該實例調用A :: Notify?

據我所知,沒有辦法將其他參數傳遞給LoadLibrary。

如果A :: Notify可以是靜態的,或者A是一個單身,從exe中導出一個「NotifyA」方法,然後讓dll調用LoadLibrary(「yourexe」),GetProcAddress獲取NotifyA的地址然後你可以打電話。 (是exe文件可以導出方法,如DLL文件!)

第二個選項是編寫您自己的LoadLibrary,該DLL主後調用第二個方法,如

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的初始化方法可以存儲稍後的實例。

+0

我認爲A對象不在DLL中,不是嗎? – neuro 2009-08-10 09:55:24

1

DLL在每個進程中加載​​一次。加載完成後,只要在進程中創建線程,就會自動調用它的DllMain。假設是一個全局變量,你可以做到以下幾點:

  1. 你第一次加載DLL後,調用導出函數將在DLL中的全球指針設置爲
  2. 每當DllMain中被調用,原因是線程連接,通過您在DLL中的指針調用A.

另一個選擇是在你的exe文件中啓動一個消息循環,並將它的線程ID傳遞給DLL。然後,每當一個線程連接到DLL,就會向消息循環發送一條消息,其中包含創建的線程的詳細信息。這是一個稍微複雜一些的解決方案,但它可以節省您使DLL熟悉A類的需求。