介绍这种方法之前,我们先介绍下一些背景知识
每个exe或者dll文件都是由节组成,按照规定,每个标准节都是以圆点开头
举个例子:代码节为”.text”
所有未初始化的数据被编入”.bss”节
初始化的数据被编入”.rdata”节
每个节都有其属性
READ:该节的数据只读
WRITE:该节的数据可写
EXECUTE:该节的数据只能执行
SHARED:该节的数据可以被多个实例共享
这里介绍一下常见的节名及其作用
我们说的这个方法就要用到SHARED属性
#pragma data_seg("Shared");//创建一个名为"Shared"的节
long g_AppCount=0;//将已经初始化的变量g_AppCount放入节中
#pragma data_seg();//停止将变量放入节中
以上代码需要注意的是:如果变量未初始化是无法放入节中的
这样写在代码中编译器时无法识别的,所以还需要设置链接程序开关形如
“/Sextion:name,attribute”
把这段链接开关嵌入程序中需要使用特殊的命令
#pragma comment(linker,"/Section:Shared,RWS")
//Shared为节的名字
//RWS R:Read W:Write S:Shared
现在附上完整的代码
AppInst.cpp
#include <windows.h>
#include <windowsx.h>
#include "resource.h"
HINSTANCE g_hInstance;
#pragma data_seg("Shared")
long g_AppCount=0;
#pragma data_seg()
UINT g_MyMessage=WM_APP+123;
#pragma comment(linker,"/Section:Shared,RWS")
int WINAPI DlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
g_hInstance=hInstance;
g_MyMessage=RegisterWindowMessage(TEXT("Count"));
InterlockedExchangeAdd(&g_AppCount,1);
DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG_MAIN),NULL,DlgProc);
InterlockedExchangeAdd(&g_AppCount,-1);
PostMessage(HWND_BROADCAST,g_MyMessage,0,0);
return 0;
}
int WINAPI DlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HICON hIcon=NULL;
if(message==g_MyMessage)
{
SetDlgItemInt(hwnd,IDC_COUNT,g_AppCount,FALSE);
}
switch(message)
{
case WM_CLOSE:
PostQuitMessage(0);
return 1;
case WM_INITDIALOG:
PostMessage(HWND_BROADCAST,g_MyMessage,0,0);
hIcon=LoadIcon(g_hInstance,MAKEINTRESOURCE(IDI_ICON_APPINST));
PostMessage(hwnd,WM_SETICON,ICON_BIG,(LPARAM)hIcon);
PostMessage(hwnd,WM_SETICON,ICON_SMALL,(LPARAM)hIcon);
return 1;
}
return 0;
}
resource.h
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by Script2.rc
//
#define IDD_DIALOG1 101
#define IDD_DIALOG_MAIN 101
#define IDI_ICON_APPINST 102
#define IDC_COUNT 1000
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 103
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
script2.rc
//Microsoft Developer Studio generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// Chinese (P.R.C.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_DIALOG_MAIN DIALOG DISCARDABLE 0, 0, 100, 33
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "AppInst"
FONT 10, "System"
BEGIN
LTEXT "实例数量:",IDC_STATIC,14,13,35,9
LTEXT "#",IDC_COUNT,53,13,35,9
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE
BEGIN
IDD_DIALOG_MAIN, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 93
TOPMARGIN, 7
BOTTOMMARGIN, 26
END
END
#endif // APSTUDIO_INVOKED
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE DISCARDABLE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON_APPINST ICON DISCARDABLE "AppInst.ico"
#endif // Chinese (P.R.C.) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
运行情况如下
打开一个的时候
打开两个的时候
打开三个的时候
OK,大功告成