創建線程時候參數傳遞方法及參數改變問題
多參數傳遞
這個是MSDN 給出的函數原型
HANDLE WINAPI CreateRemoteThread(
_In_ HANDLE hProcess,
_In_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ SIZE_T dwStackSize,
_In_ LPTHREAD_START_ROUTINE lpStartAddress,
_In_ LPVOID lpParameter,
_In_ DWORD dwCreationFlags,
_Out_ LPDWORD lpThreadId
);
lpParameter 我們用於傳遞參數的形參
由於其類型是 LPVOID 感覺MS 命名 就是 (VOID *)類型, 所以對參數進行取址, 在線程中進行轉換就好
CreateRemoteThread(hRemoteProcess, NULL, 0, pfnStartAddr, &i, 0, NULL))
如果涉及到多參數傳遞 , 就需要傳遞一個結構體了
struct ThrdPara
{
HWND hWnd;
HWND hWnd2;
HANDLE hPipe;
};
ThrdPara thrdPara;
thrdPara.hPipe = m_hPipe;
thrdPara.hWnd = ::AfxGetMainWnd()->m_hWnd;
CreateRemoteThread(hRemoteProcess, NULL, 0, pfnStartAddr, &thrdPara, 0, NULL))
//然後在線程函數裏面, 重新轉換爲ThrdPara類型即可
參數改變問題
遇到了一個難搞的問題, 還是折騰了半天
就以上述代碼爲例, 在運行過程中,
發現在主線程中的值, 和在子線程的值,完全不一樣,基本是子線程是隨機的
傳入的值,和子線程得到的不等(還以爲發現了啥天大的bug
最後終於找到了問題躲在
func()
{
CreateThread...
//sleep
return...
}
這裏是代碼結構導致的 , 因爲此處,創建完成線程之後, 函數直接返回
讓後,問題就來了 , 傳入的是局部變量, 返回之後, 進過棧平衡,
那這樣我們傳入的地址,早都不知道是啥了;
所以去掉sleep的註釋即可