前几天看到某君问到:如何在一台机器上实现只能运行一个程序的10份实例?于是我思考了一下,写出了实现代码。程序的界面如下:
由于这个程序有无界面关系不大,所以就没怎么装扮,也没有把刘涛的照片加进来。
在以前就听说了可以让程序只运行一份实例,实现这个的方法还是比较多的,用得最普遍的可能就是Mutex。而现在的任务是可以运行10份实例,有朋友可能会说用Mutex会很容易完成,然而遗憾的是只用Mutex真的很难实现,
(A:我要用互斥来实现这个任务。
B:仅用互斥很难实现,它不适合你,放弃吧!
A:非互斥不要)
嘿嘿....A君的痴情似乎不应该用在这里,那么花心的我应该如何实现呢?答案即将接晓,让我们拭目以待!下面插播5分钟的广告,广告后再继续。
广告中.....
好了广告完了,废话也完了,下面来说一下主题:
主要的方法就是在程序中加入共享节添加一个全标志位,然后再作判断就可以实现了。关于共享节并不想说太多,一句话:它是居家旅行,进程通信之必备良药:
#include <windows.h>
#include "resource.h"
#include <stdio.h>
#pragma data_seg(".thinkSJ")/添加一个新节并共享
DWORD gs_dCount = 0;
#pragma data_seg()
#pragma comment(linker,"/section:.thinkSJ,RWS")
LRESULT CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM);
int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR,int)
{
::DialogBoxParam (hInstance,(LPCTSTR)IDD_MAIN,NULL,(DLGPROC)DlgProc,NULL);
return 1;
}
LRESULT CALLBACK DlgProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG:
gs_dCount += 1; //在初使化消息中对全局标志位加1
if(gs_dCount > 5)/该程序只能运行5份实例
{
::SendMessage (hWnd,WM_CLOSE,0,0);
}
return true;
case WM_CLOSE:
gs_dCount -= 1;//在关闭消息中对全局标志位减1
::EndDialog (hWnd,0);
return true;
}
return false;
}
声明:文中所涉及的人物(如:A君、B君)匀采用化名,请勿对号入座!