《windows核心編程》學習筆記——在同一個可執行檔或dll的多個執行個體間共用待用資料

來源:互聯網
上載者:User

        預設情況下,同一個exe檔案或dll的多個執行個體之間不會共用全域或待用資料。 windows沒有提供一種簡便的方法來檢查使用者是否在運行同一個應用程式的多個執行個體。如果應用程式的多個執行個體能夠共用同一個全域變數,那麼我們就可以用這個變數來儲存正在啟動並執行執行個體的數量。通過這個方法可以控制當前啟動並執行進程執行個體數量。
        每個exe檔案或dll檔案映像有許多段組成,每個標準的段名都以點號開始。如代碼放在名為.text的段中,未初始化的資料放在.bss段中,以初始化的資料放在.data段中。每個段都有幾種屬性:READ, WRITE, EXECUTE, SHARED。其中SHARED屬性就是將要用來實現多執行個體共用資料的方法。除了使用編譯器和連結器所建立的標準段外,我們還可以在編譯的時候建立自己的段。例如我們建立一個名為“Shared“的段,它只包含一個LONG變數。
#pragma data_seg("Shared")
volatile LONG g_lApplicationInstances = 0;
#pragma data_seg()
需要注意的是編譯器只會將已初始化的變數儲存在這個段中。此外visual c++ 還提供了一個allocate聲明符,它允許我們將未初始化的資料放到我們想放的任何段中。例如:
_declspec (allocate("Shared")) int c = 0; 其中的段必須是已經存在的。
        有了上面這種方法,我們就可以把那些多個執行個體間共用的變數放在一個單獨的段中。一旦把變數放到了單獨的段中,系統就不會再在同一個可執行檔或dll的每個執行個體為它們建立新的執行個體了。為了共用變數,我們還必須告訴連結器要共用這個段中的變數。可以通過在連結器的命令列中使用/SECTION開關來實現:/SECTION: name, attributes。name指定段名,attributes指定段屬性。上面的Shared例子中,可以直接把連結器開關嵌入到原始碼中:
#pragma comment(linker, "/Section:Shared,RWS")         RWS 為READ, WRITE, SHARED屬性的組合。
上面這行代碼告訴編譯器把其中的字串嵌入到所產生的.obj檔案中的一個特殊段中,段名為”.drectve"。當連結器把所有的.obj模組合并到一起的時候,連結器會檢查每個模組的”.drectve“段,並將所有的字串當做是傳給連結器的命令列參數。

樣本程式:

#include <Windows.h>#include <tchar.h>#include "resource.h"UINT g_uMsgAppInstCountUpdate = WM_APP + 123;//自訂訊息,在新執行個體建立和銷毀的時候通知//所有相關的頂層視窗#pragma data_seg("Shared")volatile LONG g_lApplicationInstances = 0;//多線程訪問,使用volatile避免編譯器做最佳化#pragma data_seg()#pragma comment(linker, "/Section:Shared,RWS")INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){if(uMsg == g_uMsgAppInstCountUpdate){SetDlgItemInt(hwnd, IDC_EDIT_NUM, g_lApplicationInstances, FALSE);//顯示當前應用程式的執行個體個數}switch(uMsg){case WM_INITDIALOG:PostMessage(HWND_BROADCAST, g_uMsgAppInstCountUpdate, 0, 0);//廣播break;case WM_COMMAND:switch(LOWORD(wParam)){case IDOK:case IDCANCEL:EndDialog(hwnd, 0);break;}break;}return FALSE;}int WINAPI WinMain( IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, IN LPSTR lpCmdLine, IN int nShowCmd){g_uMsgAppInstCountUpdate = RegisterWindowMessage(_T("MsgAppInstCountUpdate"));InterlockedExchangeAdd(&g_lApplicationInstances, 1);DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, Dlg_Proc);InterlockedExchangeAdd(&g_lApplicationInstances, -1);PostMessage(HWND_BROADCAST, g_uMsgAppInstCountUpdate, 0, 0);return 0;}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.