内核对象(3)之单实例程序的创建

前面讲过使用命名对象来跨进程共享内核对象
现在我们来讲讲单实例程序的创建
其实很简单,使用Create内核对象的函数,当第二次创建的时候,会提示ERROR_ALREADY_EXISTS ,这个时候我们要终止程序的运行
以下是一个例子,大家只需关注入口函数的前9行

#include "stdafx.h"
#include <Windows.h>
#include <Psapi.h>
#include <TlHelp32.h>
#include <iostream>
#include <stdlib.h>
#pragma comment(lib,"Psapi.lib")
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE hEvent;
    if (hEvent = CreateEvent(NULL, FALSE, TRUE, TEXT("hello")))
    {
        if (GetLastError() == ERROR_ALREADY_EXISTS)
        {
            MessageBox(NULL, TEXT("已经存在一个运行的实例"), TEXT("error"), MB_OK);
            return 0;
        }
    }
    bool bRet = false;
    HANDLE hProcess;
    setlocale(LC_ALL, "chs");
    HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (INVALID_HANDLE_VALUE == hSnap)
        cout << "创建系统进程快照失败" << endl;
    PROCESSENTRY32 info = { 0 };
    info.dwSize = sizeof(PROCESSENTRY32);
    bRet=Process32First(hSnap, &info);
    while (bRet)
    {
        cout << info.szExeFile << endl;
        bRet = Process32Next(hSnap, &info);
    }
    CloseHandle(hSnap);
    PROCESS_INFORMATION pi;
    STARTUPINFO stp = {0};
    stp.cb = sizeof(STARTUPINFO);
    stp.wShowWindow = SW_SHOW;
    //WinExec("D:\\BaiduNetdiskDownload\\DrvCrt.exe", SW_SHOW);
    //ShellExecute(NULL, TEXT("open"), TEXT("D:\\BaiduNetdiskDownload\\DrvCrt.exe"), NULL, NULL, SW_SHOW);
    //HANDLE handle;
    //ShellExecute(NULL, TEXT("open"), TEXT("https://www.baidu.com"), NULL, NULL, SW_SHOWNORMAL);
    ShellExecute(NULL, TEXT("open"), TEXT("mailto:"), NULL, NULL, SW_SHOWNORMAL);
    //CreateProcess(TEXT("D:\\BaiduNetdiskDownload\\DrvCrt.exe"), NULL, NULL, NULL, false, NULL, NULL, NULL,&stp,&pi);
    int err=GetLastError();
    //ResumeThread(pi.hThread);
    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值