2010-04-20 23 views
1

在C++中,像setTimeout-function這樣的JavaScript最便宜的方法是什麼?C++ setTimout函數?

我需要這個: 從現在起5000毫秒,啓動函數xy(無參數,無返回值)。

原因是我需要初始化文本到語音的COM,但是當我在dll上執行它時,它會崩潰。

它工作正常但是如果我不從dllmain調用CoInitialize。

我只需要調用CoInitialize和CoCreateInstance,然後在其他函數中使用該實例。我可以通過檢查NULL來捕獲未初始化的實例,但我需要初始化COM - 而不會崩潰。

回答

5

DllMain()調用CoInitialize()是一件壞事;對於DllMain()可以做什麼有很多限制;在這裏看到:http://blogs.msdn.com/larryosterman/archive/2004/04/23/118979.aspx

即使沒有工作可靠,然後從DllMain()內初始化COM還不是一個特別好的事情做,因爲COM每個線程被初始化,你不知道什麼是應用程序本身要與問候做到你想要初始化COM的線程的COM公寓...這意味着你可能以一種方式初始化COM,然後應用程序可能需要以另一種方式初始化它,並且可能由於你的DLL做了什麼而失敗。

只要您小心翼翼(請參閱http://blogs.msdn.com/oldnewthing/archive/2007/09/04/4731478.aspx),然後在該線程上初始化COM並在該線程上執行所有與COM相關的工作,您就可以啓動DllMain()中的線程。你將需要編組任何你需要使用COM的數據,無論你從哪個線程調用到你自己的COM線程,並從那裏進行COM調用...

然後有一個問題,你創建的COM對象(你可以可靠地做你想做的事情)可以從調用你的DLL的線程中調用...你明白你如何編組接口指針if需要等等?

另外,你應該通過COM暴露你的功能,然後讓應用程序加載你的DLL作爲COM DLL,一切都會正常工作。您可以指定您需要的公寓類型,並且該應用程序負責正確地爲您設置。

所以,總之,你不需要你的問題的答案。

+0

這和我的問題有什麼關係? 我正準備避免在DllMain中調用CoInitialize,這就是爲什麼我需要setTimeout,一旦DllMain完成就執行該函數。線程也不是一個解決方案,你真的不能在DllMain中啓動一個線程... – 2010-04-20 17:28:25

+0

PS:不,我不能導出函數並從可執行文件中調用它,因爲我沒有可執行文件的源代碼。 – 2010-04-20 17:29:27

+0

因此,假設你可以設置你想要的定時器,在DllMain()返回後觸發時代碼將被執行的線程是什麼?按照我發佈的鏈接,如果你遵守規則,你可以在DllMain()中啓動一個線程;但它仍然不被推薦。而且,正如我所指出的那樣,並不是您決定以特定方式在應用程序所擁有的線程上初始化COM的地方...... – 2010-04-20 20:17:39

0

如果完全停止執行5秒,則可以使用Winapi Sleep函數。請注意,Sleep的文檔介紹了CoInitialize和Messages的一些可能的問題。

+2

但這不會幫助他解決他的實際問題... – 2010-04-20 12:44:53