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;}
- experiment : CreateProcess 的参数问题
- CreateProcess诡异的参数问题
- CreateProcess的命令行参数
- CreateProcess失败的问题
- 关于CreateProcess的问题
- Createprocess遇到的问题
- createprocess函数的参数说明:
- experiment : 解决vs2008不能安装的问题
- 解决CreateProcess()的等待时间问题
- CreateProcess的命令行参数的长度
- experiment : 使用OD 调试带启动参数的程序
- CreateProcess要注意的一个问题
- 线程中调用CreateProcess 的问题。
- CreateProcess输入参数例子
- CreateProcess输出参数例子
- CreateProcess参数传递细节
- CreateProcess创建的子进程的命令行参数
- CreateProcess创建的子进程的命令行参数 - 早雪网
- libevent源码学习-第二天
- Bean的生命周期
- 13-三目运算符
- 分布式文件系统HDFS
- 黑马程序员 eclipse中队项目文件夹出现红叉解决的方案
- experiment : CreateProcess 的参数问题
- js中的屏蔽
- "企鹅"先生问鼎中国家族财富榜首富的背后故事
- ScrollView监听停止滑动,判断是否滑到底部
- C++11学习:auto和decltype
- jQuery选择器之过滤选择器之可见度过滤选择器
- Android中文API(122) —— AudioRecord
- 有兴趣的运行一下
- 14-字符串运算符、类型运算符