2011-12-27 59 views
4

我想創建卸載它自身的一些condifiton的情況下,一個DLL,這意味着可以Dllmain使用FreeLibrary?

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) 
{ 
if (ul_reason_for_call==DLL_PROCESS_ATTACH) 
if (!CheckSomething()) //check if a file doesnt exists for example 
FreeLibrary(hModule); 

} 

我試過,但我不能讓它開始工作。如果有其他解決方案的話。請告訴我,我不想要附加dll的進程卸載它,我想讓它卸載它自己

+0

避免這樣做,客戶端代碼變得非常難以診斷的錯誤就是沒有絲毫關係的真正原因DLL不能正常工作。您可以隨時在客戶端代碼可能要使用的任何導出函數中調用CheckSomething()。 – 2011-12-27 16:45:36

+0

@HansPassant感謝您的回覆,但在我的情況下,我無法控制客戶端,我需要這樣做這種骯髒的方式,這不是很好的做法..任何方式我會返回false,以防我不希望它被加載.. – CnativeFreak 2011-12-27 16:49:29

回答

14

你不能卸載DLL,它還沒有被加載。這就是BOOL的回報。如果您不想加載DLL,則返回FALSE

+0

大聲笑!,非常感謝,我不知道,如果我回False的LoadLibrary將freeIt。 11分鐘後我會接受你的答案(我現在不能)再次感謝:) – CnativeFreak 2011-12-27 16:41:50

0

如果你在dll主函數中調用FreeLibrary,你必須看到崩潰信息。 因爲FreeLibrary函數調用成功。但FreeLibrary返回地址是釋放內存。 因此,進程導致崩潰!(訪問衝突)。

如果你想看到「DLL自卸」源代碼:Dll Self Unloading

+1

對於Dll自卸載(DllMain之外)使用FreeLibraryAndExitThread。請參閱http://stackoverflow.com/a/20280145/193017 – 2014-07-28 00:18:57