亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我編寫了一個Dll并且測試多線程,如下代碼:

我編寫了一個Dll并且測試多線程,如下代碼:

API
郎朗坤 2022-07-13 15:11:16
UINT __cdecl NowThread (LPVOID lpParam){MessageBox(NULL,_T("開啟新線程成功!"),_T("注入"),MB_OK);return 0;}// CGameDllApp 初始化BOOL CGameDllApp::InitInstance(){MessageBox(NULL,_T("DLL注入成功!"),_T("注入"),MB_OK); //僅這一句執行了CWinThread* mythread = AfxBeginThread(NowThread,NULL,THREAD_PRIORITY_NORMAL,0,0,NULL);MessageBox(NULL,_T("開啟線程完成!"),_T("注入"),MB_OK);return CWinApp::InitInstance();}Dll加載后,僅執行了第一個MessageBox,后面的兩個都沒有執行說明開啟新線程不但失敗了,并且也沒有往下執行
查看完整描述

2 回答

?
斯蒂芬大帝

TA貢獻1827條經驗 獲得超8個贊

這樣解釋或許你更能明白:
創建線程會調用應用程序已經加載的所有DLL的DLLMain(參見DLLMain的文檔中關于reason參數的說明),而DLLMain是不可以重入的,所以應用程序會死鎖。
也就是:BOOL CGameDllApp::InitInstance()在你的DLL的DLLMain中被調用,而你此時又創建線程,就會再次想調用你的DLL的DLLMain,但是CGameDllApp::InitInstance()所在的DLLMain并未執行完。所以就得等待完成,所以就AfxbeginThread等待自己完成操作,卡在這里了。

查看完整回答
反對 回復 2022-07-18
?
嚕嚕噠

TA貢獻1784條經驗 獲得超7個贊

系統是順序調用D L L的D l l M a i n函數的。為了理解這樣做的意義,可以考慮下面這樣一個環境。假設一個進程有兩個線程,線程A和線程B。該進程還有一個D L L,稱為S o m e D L L . d l l,它被映射到了它的地址空間中。兩個線程都準備調用C r e a t e T h r e a d函數,以便再創建兩個線程,即線程C和線程D。
當線程A調用C r e a t e T h r e a d來創建線程C時,系統調用帶D L L _ T H R E A D _ AT TA C H值的S o m e D L L . d l l的D l l M a i n函數。當線程C執行D l l M a i n函數中的代碼時,線程B調用C r e a t e T h r e a d函數來創建線程D。這時系統必須再次調用帶有D L L _ T H R E A D _ AT TA C H值的D l l M a i n函數,這次是讓線程D 執行代碼。但是,系統是順序調用D l l M a i n函數的,因此系統會暫停線程D的運行,直到線程C完成對D l l M a i
n函數中的代碼的處理并且返回為止。
當線程C完成D l l M a i n的處理后,它就開始執行它的線程函數。這時系統喚醒線程D,讓它處理D l l M a i n中的代碼。當它返回時,線程D開始處理它的線程函數。
AfxBeginThread的核心還是CreateThread函數。
所以請將AfxBeginThread函數從InitInstance里面拿出來,在導出個其他函數進行AfxBeginThread調用吧。


查看完整回答
反對 回復 2022-07-18
  • 2 回答
  • 0 關注
  • 141 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號