您的位置:首页 > 其它

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

2017-08-28 22:13 393 查看
前面讲过使用命名对象来跨进程共享内核对象

现在我们来讲讲单实例程序的创建

其实很简单,使用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐