內存映射之共享靜態數據的方法

介紹這種方法之前,我們先介紹下一些背景知識
每個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,大功告成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章