2012-09-16 54 views
2

我想將Win32::Setupsup這個基於C++的舊模塊與Visual C++配合使用,用於草莓Perl和它使用的MinGW GCC。除了一件事之外,我幾乎可以開展工作。爲什麼Strawberry Perl不會調用我的DllMain?

該模塊的C++部分有一個DllMain函數,該函數在DLL_PROCESS_ATTACH處運行一些初始化代碼,在DLL_PROCESS_DETACH處執行清理代碼。當我用Visual C++編譯模塊時,它工作正常。但是當我使用草莓Perl使用的MinGW GCC進行編譯時,DllMain永遠不會被調用。

我認爲這個問題只是DllMain沒有正確識別爲與gcc編譯DLL的入口點。但我不知道如何解決這個問題。

工作進展在my GitHub repo for Win32::Setupsup。雖然我使用Dist::Zilla來管理版本,但實際上並不需要dzil來測試它。只需克隆回購,perl Makefile.PLdmake test。在你的代碼

+1

請問['extern「C」'](http://news.gmane.org/find-root.php?message_id=%3c200306030033.51176.hg%40technosis.de%3e)有幫助嗎? – ephemient

+0

@ephemient,做到了!而且它似乎也不打擾Visual C++。把它寫成答案,我會接受它。 – cjm

回答

2

看,你有

BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD reason, LPVOID reserved); 
在C++源文件

。由於這是一個C++函數,因此G ++將名稱改爲類似[email protected]的名稱,並且在加載該庫時找不到它。

爲了解決這個問題,使用extern "C",無論是在功能聲明

extern "C" 
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD reason, LPVOID reserved); 

或在塊

extern "C" { 
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD reason, LPVOID reserved); 
} 

,以確保該函數給定的C鍵(避免C++名字粉碎)。

相關問題