首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

!C++保证createprocess创建的进程只有一个运行在当前系统进程

2012-09-18 
高手进!!C++保证createprocess创建的进程只有一个运行在当前系统进程我的主进程通过createprocess(“.\\hah

高手进!!C++保证createprocess创建的进程只有一个运行在当前系统进程
我的主进程通过createprocess(“.\\haha.exe -a”....)创建进程haha.exe。
现在要保证当前系统进程中只有一个haha.exe存在
补充:当主进程再次执行时,将先判断系统进程是否存在haha.exe进程。不存在才用createprocess函数再次创建。
网上大侠告诉我的方法有以下:(我有疑问)
第一个:
HANDLE hSingle = CreateMutex(NULL, NULL, “haha.exe”)
if(hSingle == NULL && ERROR_ALREADY_EXISTS == GetLastError())
//已经存在
...
else
{
//不存在,创建子进程
 CreateProcess(“.\\haha.exe -a”....);
}

这个我遇到的问题是:不管怎么执行,总是创建子进程,当前系统进程中存在着haha.exe,
这个if(hSingle == NULL && ERROR_ALREADY_EXISTS == GetLastError())就和没用一样。求解答。我哪里用错了。

第二个:
bool MyWatch(char * thread_name)
{
  PROCESSENTRY32 pe32;
  char * mychar;
  BOOL bstart=TRUE;
  HANDLE hProcessSnap;


  while(1)
  {
  pe32.dwSize=sizeof(pe32);
  hProcessSnap=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  if(hProcessSnap==INVALID_HANDLE_VALUE)
  {
  printf("CreateToolhelp32Snapshot调用失败!\n");
  return -1;
  }
  //遍历进程快照。轮流显示每个进程的信息

   
  bstart = TRUE;
  BOOL bMore=::Process32First(hProcessSnap,&pe32);
  USES_CONVERSION; //启用宏命令标记  
  mychar = W2A(pe32.szExeFile);
  if(0==strcmp(thread_name,mychar)) //比较你的进程名字是否相同,判断是否进程在启动
  {
  printf("你的程序在运行!");
  bstart = FALSE;
  break;
  }
// printf("进程名称:%s\n",W2A(pe32.szExeFile));
// printf("进程ID号:%u\n\n",pe32.th32ProcessID);  
  bMore=::Process32Next(hProcessSnap,&pe32);
  }

  //清除snapshot对象
  ::CloseHandle(hProcessSnap);

  return bstart;
}
以下简单一写我的主进程
int main()

  if(MyWatch(“haha.exe”))
  {
  createprocess(".\\haha.exe");
  }
  return 0;

这个方法我的疑问:不管怎么执行,这个上面main里面的判断总是true,总是执行createprocess函数。系统进程里有haha.exe也再次执行。请问我哪里理解的不对。高手快来帮我解答下吧。万分感谢。

谁还有好的方法也可以告诉我。重点是我通过createprocess函数创建的是带参数的可执行文件。
有懂得指点下俺。坐等求指教。。。。。。

[解决办法]
不要判断进程名称,可能有多个相同名称的进程
而要判断进程id,一个系统下进程id是唯一的
[解决办法]
if(hSingle == NULL && ERROR_ALREADY_EXISTS == GetLastError())
如果系统存在同名的互斥量,会返回之前同名的互斥量对象句柄,并不是返回NULL.

[解决办法]
1、是在你父进程中做,也就是说只有父进程才能确保只存在一个进程。
另外确实,把hSingle == NULL 去掉
如果GetLastError返回0,说明没有错误

2、应该是和你用的项目字符集有关系,或者进程名称不同

私信我,qq告诉我,帮你调试一下吧
[解决办法]
当初我是监视程序,因此需要while(1)
现在你只要遍历1次就可以判断是否需要重新CreateProcess了。
把While(1)去掉吧
[解决办法]


C/C++ code
  HANDLE hMutex = CreateMutex(NULL, TRUE, _T("MutexName"));  if(GetLastError() == ERROR_ALREADY_EXISTS)  {    return(-1);  }
[解决办法]
最简单的当然就是:程序每次启动都试图去创建一个全局的互斥量
系统中如果已经有程序在运行那么在创建互斥量就会返回ERROR_ALREADY_EXISTS

热点排行