内存映射之共享静态数据的方法

介绍这种方法之前,我们先介绍下一些背景知识
每个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,大功告成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值