关于CreateProcess

来源:互联网 发布:宁波商品房成交数据 编辑:程序博客网 时间:2024/06/02 04:42

1. 使用

例子:

使用ie打开指定的网页。

注意第二个参数是 可执行文件+命令行参数

 

[cpp] view plaincopyprint?
  1. #include "stdafx.h"   
  2. #include <windows.h>    
  3. #include <stdio.h>    
  4.   
  5. int main(int argc, char* argv[])   
  6. {   
  7.     STARTUPINFO si = { sizeof(si) };   
  8.     PROCESS_INFORMATION pi;   
  9.   
  10.     si.dwFlags = STARTF_USESHOWWINDOW;   
  11.     si.wShowWindow = TRUE; //TRUE表示显示创建的进程的窗口  
  12.     TCHAR cmdline[] =TEXT("c://program files//internet explorer//iexplore.exe http://community.csdn.net/");  
  13.     BOOL bRet = ::CreateProcess (   
  14.         NULL,  
  15.         cmdline, //在Unicode版本中此参数不能为常量字符串,因为此参数会被修改    
  16.         NULL,   
  17.         NULL,   
  18.         FALSE,   
  19.         CREATE_NEW_CONSOLE,   
  20.         NULL,   
  21.         NULL,   
  22.         &si,   
  23.         &pi);   
  24.   
  25.     int error = GetLastError();  
  26.     if(bRet)   
  27.     {   
  28.         ::CloseHandle (pi.hThread);   
  29.         ::CloseHandle (pi.hProcess);   
  30.   
  31.         printf(" 新进程的进程ID号:%d /n", pi.dwProcessId);   
  32.         printf(" 新进程的主线程ID号:%d /n", pi.dwThreadId);   
  33.     }   
  34.     else  
  35.     {  
  36.         printf("error code:%d/n",error );  
  37.     }  
  38.     return 0;   
  39. }   

 

也可如此:

第一个参数是 可执行文件;第二个参数是 命令行参数

 

 

[cpp] view plaincopyprint?
  1. #include "stdafx.h"   
  2. #include <windows.h>    
  3. #include <stdio.h>    
  4.   
  5. int main(int argc, char* argv[])   
  6. {   
  7.     STARTUPINFO si = { sizeof(si) };   
  8.     PROCESS_INFORMATION pi;   
  9.   
  10.     si.dwFlags = STARTF_USESHOWWINDOW;   
  11.     si.wShowWindow = TRUE; //TRUE表示显示创建的进程的窗口  
  12.     TCHAR cmdline[] =TEXT(" http://community.csdn.net/"); //注意前面有空格,否则打开的是主页。  
  13.     BOOL bRet = ::CreateProcess (   
  14.         TEXT("c://program files//internet explorer//iexplore.exe"),  
  15.         cmdline, //在Unicode版本中此参数不能为常量字符串,因为此参数会被修改    
  16.         NULL,   
  17.         NULL,   
  18.         FALSE,   
  19.         CREATE_NEW_CONSOLE,   
  20.         NULL,   
  21.         NULL,   
  22.         &si,   
  23.         &pi);   
  24.   
  25.     int error = GetLastError();  
  26.     if(bRet)   
  27.     {   
  28.         ::CloseHandle (pi.hThread);   
  29.         ::CloseHandle (pi.hProcess);   
  30.   
  31.         printf(" 新进程的进程ID号:%d /n", pi.dwProcessId);   
  32.         printf(" 新进程的主线程ID号:%d /n", pi.dwThreadId);   
  33.     }   
  34.     else  
  35.     {  
  36.         printf("error code:%d/n",error );  
  37.     }  
  38.   
  39.   
  40.     return 0;   
  41. }   

2. 检查是否退出或存在

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


C++例子
#include "StdAfx.h"
#include "windows.h"
#include "tlhelp32.h"
#include "stdio.h"
int main(int argc, char* argv[])
{
PROCESSENTRY32 pe32;
//在使用这个结构前,先设置它的大小
pe32.dwSize = sizeof(pe32);
//给系统内所有的进程拍个快照
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
printf("CreateToolhelp32Snapshot 调用失败.\n");
return -1;
}
//遍历进程快照,轮流显示每个进程的信息
BOOL bMore = ::Process32First(hProcessSnap,&pe32);
while (bMore)
{
printf("进程名称:%s\n",pe32.szExeFile);
printf("进程ID:%u\n\n",pe32.th32ProcessID);
bMore = ::Process32Next(hProcessSnap,&pe32);
}
//不要忘记清除掉snapshot对象
::CloseHandle(hProcessSnap);
return 0;
}

3 杀进程

  1. #include <stdio.h>  
  2. #include <windows.h>  
  3. #include <winbase.h>  
  4. #include <tlhelp32.h>  
  5. #pragma comment(lib,"kernel32.lib")  
  6. #pragma comment(lib,"advapi32.lib")  
  7. void EnableDebugPriv() {  
  8.     HANDLE hToken;  
  9.     TOKEN_PRIVILEGES tkp;  
  10.     OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);  
  11.     LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);  
  12.     tkp.PrivilegeCount = 1;  
  13.     tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;  
  14.     AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, NULL);  
  15.     CloseHandle(hToken);  
  16. }  
  17. int pskill(int id)   //根据进程ID杀进程  
  18. {  
  19.     HANDLE hProcess=NULL;  
  20.     //打开目标进程  
  21.     hProcess=OpenProcess(PROCESS_TERMINATE,FALSE,id);  
  22.     if (hProcess==NULL) {  
  23.         wprintf(L"\nOpen Process fAiled:%d\n",GetLastError());  
  24.         return -1;  
  25.     }  
  26.     //结束目标进程  
  27.     DWORD ret=TerminateProcess(hProcess,0);  
  28.     if(ret==0) {  
  29.         wprintf(L"%d",GetLastError());  
  30.     }  
  31.     return -1;  
  32. }  
  33. int main() {  
  34.     //进程列举  
  35.     HANDLE hSnApshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);  
  36.     if (hSnApshot != INVALID_HANDLE_VALUE) {  
  37.         PROCESSENTRY32 te = { sizeof(te) };  
  38.         BOOL f0k = Process32First(hSnApshot, &te);  
  39.         for (; f0k; f0k = Process32Next(hSnApshot, &te)) {  
  40.             wprintf(L"Pid: %d %s\n", te.th32ProcessID, te.szExeFile);  
  41.         }  
  42.     }  
  43.     CloseHandle(hSnApshot);  
  44.     //杀进程  
  45.     wprintf(L"the process's id which you want to kill:");  
  46.     int id = 0;  
  47.     wscanf(L"%d", &id);  
  48.     EnableDebugPriv(); //提升权限  
  49.     pskill(id);  
  50.     return 0;  
  51. }  

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,不过还有一个写动作,速度略慢。





0 0
原创粉丝点击