2010-05-05 129 views
2

我有工作需要在DLL加載完成後立即完成。工作涉及同步,所以不能在dllmain內完成。是否有辦法觸發代碼執行一旦dllmain(或所有dllmains)完成?如何知道dllmain何時完成?

回答

3

根據this MSDN post

在進程啓動和DLL 初始化程序, 可以被創建,但直到DLL初始化 做了的過程中,他們沒有開始執行 新主題。

如果這是成立的,那麼你應該可以在有問題的線程中完成你的工作,直到DLLMain完成後才能開始工作。當然,這會導致一些可能的同步問題打開,如果你使用互斥鎖,也許你可以解決這個問題。

注意:我沒有嘗試過這一點,它只是在理論上看起來可能會起作用。

P.S.如果你嘗試過,請留下評論它是否有效。

+0

正如注意:Mark Wilkins的答案中提到的'最佳實踐'文檔建議不要調用'CreateThread()'(儘管它確實承認可以完成)。如果你決定沿着這條路線走,請仔細踩踏。 – 2010-05-06 00:55:53

+0

我同意做到這一點的最好方法是創建一個初始化例程,並讓DLL的用戶調用它作爲API的一部分。這是常見的,即WinSock和IBM MQSeries – 2010-05-06 01:04:18

+0

旋轉一個線程似乎工作。根據Raymond Chen的說法,你必須小心你在那裏做什麼,因爲如果你在dllmain中等待該線程時可能發生死鎖。見http://blogs.msdn.com/oldnewthing/archive/2007/09/04/4731478.aspx – 2010-05-06 19:48:51

0

最簡單的方法是將所有代碼放到另一個函數中,這個函數在加載庫之後調用。

你也可以創建一個線程來完成這項工作,但我不確定你想要做什麼。

2

從我的角度來看,這一直是一個棘手的問題。如果第三方應用程序正在使用您無法控制的DLL,那麼很難強制其他應用程序調用某個初始化函數。最終,它可能是一個需求,但不必這樣做就可以使用DLL(例如,初始化winsock)。

如果初始化調用不可行,那麼很可能您需要依賴按需發生的延遲初始化。我在DLL Best Practices上跑過一篇相當不錯的論文,可能值得一讀。它有一個很好的列表,你可以在DLLMain中做不了的特定事情。我從經驗中知道這些需要遵守(「不要」列表)。