我有一個對象A,當某個線程啓動或死亡時應該通知對象(A :: Notify()方法)。
可以說,這個線程動態加載我的一些DLL文件(我可以寫它)。
我相信我應該寫這個DLL的dllMain函數,但是我不知道如何從這個函數中獲得對A對象的引用,所以我可以運行它的Notify()方法。
有什麼想法?線程啓動時通知對象
2
A
回答
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。假設是一個全局變量,你可以做到以下幾點:
- 你第一次加載DLL後,調用導出函數將在DLL中的全球指針設置爲
- 每當DllMain中被調用,原因是線程連接,通過您在DLL中的指針調用A.
另一個選擇是在你的exe文件中啓動一個消息循環,並將它的線程ID傳遞給DLL。然後,每當一個線程連接到DLL,就會向消息循環發送一條消息,其中包含創建的線程的詳細信息。這是一個稍微複雜一些的解決方案,但它可以節省您使DLL熟悉A類的需求。
相關問題
- 1. 從遠程通知啓動
- 2. 通知ReferenceHandler線程時?
- 3. C++主線程通知線程通知主線程
- 4. 未知錯誤「線程在運行時關閉時啓動」
- 5. JBoss啓動通知
- 6. WPF通知變動對對象
- 7. C#3.0對象啓動 - 是否有通知說對象正在被初始化?
- 8. 通知未啓動活動
- 9. Android設備啓動時重複通知
- 10. 通知時間戳&從ReplaySubject啓動
- 11. 從通知中啓動應用程序
- 12. Android:應用程序啓動通知
- 13. 通知另一個對象中的線程
- 14. 1.0.2通知對象
- 15. 程序崩潰時啓動線程
- 16. Java任務隊列,線程池和具有回調的線程通知新任務何時可以啓動
- 17. Java線程:在啓動後調用Thread對象的run()方法
- 18. Java:如何啓動同一對象的另一個線程?
- 19. Java在對象構造函數中啓動線程池
- 20. Android的通知不啓動
- 21. 已啓動iTunes的通知
- 22. 在應用程序啓動時延遲ios權限通知?
- 23. 使用推送通知啓動時應用程序崩潰
- 24. 啓動應用程序時的後臺通知
- 25. 如何在某個應用程序啓動時得到通知?
- 26. 在應用程序啓動時觸發Android通知
- 27. 收到通知時重新啓動應用程序
- 28. 推送通知每次在應用程序啓動時顯示
- 29. 啓動和停止線程JButton對齊
- 30. 線程未啓動
更精確。它似乎讀取您的問題,「通知」部分是獨立於dll加載。如果這是真的,你只需要讓你的線程類調用A :: notify()(你給它一個A:DIP的引用)然後加載你的DLL。 – neuro 2009-08-10 10:00:05