experiment : CreateProcess 的参数问题

来源:互联网 发布:快屏网络收购叫停 编辑:程序博客网 时间:2024/05/23 05:08

发现 CreateProcess 的参数2 __in_opt     LPCTSTR lpApplicationName, 必须是Buffer, 而不能是一个常量指针.

/// @file       prjTestHandle.cpp/// @brief      测试某人说的CreateProcess句柄泄漏问题/// build on vs2008#include "stdafx.h"#include <Windows.h>#include <tchar.h>int _tmain(int argc, _TCHAR* argv[]){    BOOL            bRc             =   TRUE;    DWORD           dwProcessCnt    =   0;    const DWORD     dwProcessCntMax =   0x400; ///< 太多进程, 卡的不行    const wchar_t * pPeName         =   L"c:\\windows\\system32\\notepad.exe";    wchar_t pPeNameBuf[MAX_PATH]    =   {0};    /// 带 CreateProcess的这段程序, Debug版编译后, 在输出目录直接运行报错    /// 在堆操作那使用了无效的地址,     /// 被WinDbg断住后, 看不到此程序中有用的代码位置    /// 需要编译成Release版运行才正常    /// 如果需要调试, 编译成Release版带调试符号, 用WinDbg调试吧    /// 如果直接在Vs2008IDE中单步或全速运行Debug版的程序, 也是正常的    /// 很奇怪啊    STARTUPINFO si;    PROCESS_INFORMATION pi;    __try    {        while (true)        {            /// 每建立一个进程, 就休息一下, 防止CPU占用率过高            ::Sleep(1);            /// 每次建立进程, 都需要重新设置si和pi ?            ::ZeroMemory(&si, sizeof(STARTUPINFO));            ::ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));            si.cb = sizeof(STARTUPINFO);            si.dwFlags = STARTF_USESHOWWINDOW;            si.wShowWindow = SW_SHOWNORMAL;            _tcscpy_s(pPeNameBuf, MAX_PATH * sizeof(wchar_t), pPeName);            /// CreateProcess 的返回值是 BOOL, 不是HANDLE...            bRc = CreateProcess(                NULL,                 (LPWSTR)pPeNameBuf, ///< 要使用Buffer, 而不能是常量指针                NULL,                 NULL,                 FALSE,                 NORMAL_PRIORITY_CLASS,                 NULL,                 NULL,                 &si,                 &pi);            if (bRc)            {                _tprintf(L"dwProcessCnt = 0x%X\r\n", dwProcessCnt);                /// 如果要等被测试的notepad.exe执行结束, 就在这等                /// 确实要等他结束, 这个应用应该是一个守护程序                /// 防止别人杀掉在自己的程序                /// 或在自己的程序Crash后,自己重启                /// 这段代码应该在一个服务中                ::WaitForSingleObject(pi.hProcess, INFINITE);                /// 如果不等带已经建立的notepad.exe结束                /// 为了防止句柄泄漏, 需要关掉pi的2个句柄                /// 关掉句柄后, 不影响已经建立的notepad.exe                ::CloseHandle(pi.hProcess);                ::CloseHandle(pi.hThread);                if (++dwProcessCnt == dwProcessCntMax)                {                    /// 建立的进程够多了, 不搞了                    break;                }            }            else            {                _tprintf(L"error, dwProcessCnt = 0x%X, GetLastError() = 0x%X\r\n",                     dwProcessCnt,                    GetLastError());                break;            }            /// 实验结论:            /// 不存在句柄泄漏问题        }    }    __finally    {        _tprintf(L"catch error, dwProcessCnt = 0x%X, GetLastError() = 0x%X\r\n",             dwProcessCnt,            GetLastError());    }__tmain_END:    _tprintf(L"END, press any key to quit\r\n");    getwchar();    return 0;}


原创粉丝点击