1. 使用
例子:
使用ie打开指定的网页。
注意第二个参数是 可执行文件+命令行参数
- #include "stdafx.h"
- #include <windows.h>
- #include <stdio.h>
- int main(int argc, char* argv[])
- {
- STARTUPINFO si = { sizeof(si) };
- PROCESS_INFORMATION pi;
- si.dwFlags = STARTF_USESHOWWINDOW;
- si.wShowWindow = TRUE; //TRUE表示显示创建的进程的窗口
- TCHAR cmdline[] =TEXT("c://program files//internet explorer//iexplore.exe http://community.csdn.net/");
- BOOL bRet = ::CreateProcess (
- NULL,
- cmdline, //在Unicode版本中此参数不能为常量字符串,因为此参数会被修改
- NULL,
- NULL,
- FALSE,
- CREATE_NEW_CONSOLE,
- NULL,
- NULL,
- &si,
- &pi);
- int error = GetLastError();
- if(bRet)
- {
- ::CloseHandle (pi.hThread);
- ::CloseHandle (pi.hProcess);
- printf(" 新进程的进程ID号:%d /n", pi.dwProcessId);
- printf(" 新进程的主线程ID号:%d /n", pi.dwThreadId);
- }
- else
- {
- printf("error code:%d/n",error );
- }
- return 0;
- }
也可如此:
第一个参数是 可执行文件;第二个参数是 命令行参数
- #include "stdafx.h"
- #include <windows.h>
- #include <stdio.h>
- int main(int argc, char* argv[])
- {
- STARTUPINFO si = { sizeof(si) };
- PROCESS_INFORMATION pi;
- si.dwFlags = STARTF_USESHOWWINDOW;
- si.wShowWindow = TRUE; //TRUE表示显示创建的进程的窗口
- TCHAR cmdline[] =TEXT(" http://community.csdn.net/"); //注意前面有空格,否则打开的是主页。
- BOOL bRet = ::CreateProcess (
- TEXT("c://program files//internet explorer//iexplore.exe"),
- cmdline, //在Unicode版本中此参数不能为常量字符串,因为此参数会被修改
- NULL,
- NULL,
- FALSE,
- CREATE_NEW_CONSOLE,
- NULL,
- NULL,
- &si,
- &pi);
- int error = GetLastError();
- if(bRet)
- {
- ::CloseHandle (pi.hThread);
- ::CloseHandle (pi.hProcess);
- printf(" 新进程的进程ID号:%d /n", pi.dwProcessId);
- printf(" 新进程的主线程ID号:%d /n", pi.dwThreadId);
- }
- else
- {
- printf("error code:%d/n",error );
- }
- return 0;
- }
a:
WaitForSingleObject( 你的进程句柄, INFINITE ); 这种方式似乎存在问题,建议用其他。
查看MSDN里关于WaitForSingleObject的帮助就知道,它可以用来等待一个进程的结束,WaitForSingleObject执行时,就会等在那里,但不占用CPU时间,一旦正等待的进程退出,WaitForSingleObject才返回,上面的INFINITE是无限等待下去的意思。
b:
还有两个办法为:
::GetExitCodeProcess(pi.hProcess, &dwMark);
if (dwMark == STILL_ACTIVE )
{
Sleep( 3 );
printf("active...\n");
}
else
{
break;
} 这种方式似乎存在问题,建议用其他。
下面也是一个办法:
C/C++ Code Example: Retrieving Task Exit Code
This example retrieves the last exit code returned by a known task. (A returned value of "0" indicates the task was never run.) The example assumes that the task, Test Task, already exists on the local computer.
#include <windows.h>
#include <initguid.h>
#include <ole2.h>
#include <mstask.h>
#include <msterr.h>
#include <wchar.h>
int main(int argc, char **argv)
{
HRESULT hr = ERROR_SUCCESS;
///
// Call CoInitialize to initialize the COM library and then
// CoCreateInstance to get the Task Scheduler object.
///
ITaskScheduler *pITS;
hr = CoInitialize(NULL);
if (SUCCEEDED(hr))
{
hr = CoCreateInstance(CLSID_CTaskScheduler,
NULL,
CLSCTX_INPROC_SERVER,
IID_ITaskScheduler,
(void **) &pITS);
if (FAILED(hr))
{
CoUninitialize();
return 1;
}
}
else
{
return 1;
}
///
// Call ITaskScheduler::Activate to get the Task object.
///
ITask *pITask;
LPCWSTR lpcwszTaskName;
lpcwszTaskName = L"TestTask";
hr = pITS->Activate(lpcwszTaskName,
IID_ITask,
(IUnknown**) &pITask);
// Release ITaskScheduler interface.
pITS->Release();
if (FAILED(hr))
{
wprintf(L"Failed calling ITaskScheduler::Activate: ");
wprintf(L"error = 0x%x\n",hr);
CoUninitialize();
return 1;
}
///
// Call ITask::GetExitCode. Note that this method is
// inherited from IScheduledWorkItem.
///
DWORD pdwExitCode;
hr = pITask->GetExitCode(&pdwExitCode);
// Release ITask interface.
pITask->Release();
if (FAILED(hr))
{
wprintf(L"Failed calling ITask::GetExitCode: ");
wprintf(L"error = 0x%x\n",hr);
CoUninitialize();
return 1;
}
wprintf(L"The last exit code of Test Task is: %d\n", pdwExitCode);
CoUninitialize();
return 0;
}
c:
BOOL IsExeFileRun(CString ExeFileName)
{
HANDLE hProcessSnap = NULL;
PROCESSENTRY32 pe32= {0};
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == (HANDLE)-1)
{
return FALSE;
}
pe32.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hProcessSnap, &pe32))
{
do
{
if (ExeFileName.Compare(_T(pe32.szExeFile)) == 0)
{
return TRUE;
}
}while (Process32Next(hProcessSnap, &pe32));
}
CloseHandle (hProcessSnap);
return FALSE;
}
方法的参数是要判断的进程的名字,如notepad.exe
3 杀进程
- #include <stdio.h>
- #include <windows.h>
- #include <winbase.h>
- #include <tlhelp32.h>
- #pragma comment(lib,"kernel32.lib")
- #pragma comment(lib,"advapi32.lib")
- void EnableDebugPriv() {
- HANDLE hToken;
- TOKEN_PRIVILEGES tkp;
- OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
- LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
- tkp.PrivilegeCount = 1;
- tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
- AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, NULL);
- CloseHandle(hToken);
- }
- int pskill(int id) //根据进程ID杀进程
- {
- HANDLE hProcess=NULL;
- //打开目标进程
- hProcess=OpenProcess(PROCESS_TERMINATE,FALSE,id);
- if (hProcess==NULL) {
- wprintf(L"\nOpen Process fAiled:%d\n",GetLastError());
- return -1;
- }
- //结束目标进程
- DWORD ret=TerminateProcess(hProcess,0);
- if(ret==0) {
- wprintf(L"%d",GetLastError());
- }
- return -1;
- }
- int main() {
- //进程列举
- HANDLE hSnApshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
- if (hSnApshot != INVALID_HANDLE_VALUE) {
- PROCESSENTRY32 te = { sizeof(te) };
- BOOL f0k = Process32First(hSnApshot, &te);
- for (; f0k; f0k = Process32Next(hSnApshot, &te)) {
- wprintf(L"Pid: %d %s\n", te.th32ProcessID, te.szExeFile);
- }
- }
- CloseHandle(hSnApshot);
- //杀进程
- wprintf(L"the process's id which you want to kill:");
- int id = 0;
- wscanf(L"%d", &id);
- EnableDebugPriv(); //提升权限
- pskill(id);
- return 0;
- }
Windows快速创建大文件的三种方法
一、使用内存映射文件:
CreateFileMapping的参数可以设置最大长度,当实际文件的长度小于设置的最大长度时,系统自动扩展。注意:在CreateFile的时候要加写权限。
HANDLE hFile;
HANDLE hMapFile;
hFile = CreateFile(
"D:\\LargeFile.dat",
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if( hFile == INVALID_HANDLE_VALUE )
{
printf( "create file failed.\n" );
return;
}
hMapFile = CreateFileMapping(
hFile,
NULL,
PAGE_READWRITE,
0,
2*1024*1024, // 2 MByte
NULL
);
if( hMapFile == NULL )
{
printf( "create file mapping failed.\n" );
CloseHandle( hFile );
return;
}
printf( "OK!\n" );
CloseHandle( hMapFile );
CloseHandle( hFile );
二、设置文件指针 + 设置EOF
两个API完成,首先调用SetFilePointer,在参数里填入所需的长度,再调用SetEndOfFile,完成。
HANDLE hFile;
hFile = CreateFile(
"D:\\LargeFile1.dat",
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if( hFile == INVALID_HANDLE_VALUE )
{
printf( "create file failed.\n" );
return;
}
SetFilePointer(
hFile,
2*1024*1024,
NULL,
FILE_BEGIN
);
SetEndOfFile( hFile );
printf( "OK!\n" );
CloseHandle( hFile );
三、设置文件指针 + 写1Byte
也是两个API完成,首先调用SetFilePointer,再调用WriteFile写入1byte就完成了。
HANDLE hFile;
DWORD dwR;
hFile = CreateFile(
"D:\\LargeFile2.dat",
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if( hFile == INVALID_HANDLE_VALUE )
{
printf( "create file failed.\n" );
return;
}
SetFilePointer(
hFile,
2*1024*1024 - 1,
NULL,
FILE_BEGIN
);
WriteFile(
hFile,
"A",
1,
&dwR,
NULL
);
printf( "OK!\n" );
CloseHandle( hFile );
写完收工,顺便说一下,第三种方法是FlashGet使用的方法。第一种方法只发一个IRP,速度最快,第二种要发两个IRP,第三种也是发两个IRP,不过还有一个写动作,速度略慢。