http://www.cnblogs.com/gakusei/articles/1585211.html
全局共享資料
#pragma data_seg ("shareddata")
HWND sharedwnd=NULL;//共享資料
#pragma data_seg()
編譯選項加入 /SECTION:shareddata,rws
============================
用pragma設定共享資料:
#pragma data_seg("MYSEC")
char MySharedData[4096]={0};
#pragma data_seg()
然後在使用者的DEF檔案中為有名的資料區設定共享屬性。
LIBRARY TEST
DATA READ WRITE
SECTIONS
.MYSEC READ WRITE SHARED
在應用程式(程序)按外部變量引用共享資料。
extern _export"C"{char * MySharedData[];}
程序中使用該變量應注意間接引用。
m_pStatic=(CEdit*)GetDlgItem(IDC_SHARED);
m_pStatic->GetLine(0,*MySharedData,80);
=====================================
//Global.h In DLL
#pragma once
#include "StdAfx.h"
#pragma data_seg(".Shared")
int g_nExport = 33333;
CString g_strExport = "DLLEXPORT";
#pragma data_seg()
#pragma comment(linker,"/SECTION:.Shared,RWS")
如果DLL中定義了共享變量A,EXE1載入DLL,另外一個EXE2也載入DLL,則EXE1裡的DLL 和 EXE2裡的DLL将可以通路同一個A;而不是EXE1和DLL之間共享,也不是EXE2和DLL之間共享。
另外,EXE要通路DLL裡的全局變量,則DLL必須把變量export出來,EXE再import,import有隐式或顯式
===========================
http://hi.baidu.com/shilyx/blog/item/2017dca29b1777accaefd0e1.html
近日寫程式,讓全局共享變量給害苦了,現将結果公布出來,不希望有人步我後塵。 先總結經驗:全局共享變量一定要在定義時初始化,否則無效。 下面寫兩行代碼進行驗證(Visual Studio .NET 2003 + Windows Servers 2003): //main.c #include #include "resource.h" __declspec(dllexport) void Test(HWND hWnd); //主窗體回調函數 LRESULT CALLBACK MainProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { switch(message) { case WM_COMMAND: { if(LOWORD(wParam)==IDOK) { Test(hWnd); return 1; } else if(LOWORD(wParam)== IDCANCEL) { EndDialog(hWnd,0); return 1; } } } return 0; } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { DialogBox(hInstance,ID_DLG,NULL,MainProc); return 0; } /// //dll.c #include #include //定義全局共享變量 #pragma data_seg(".Shared") static int haveinit=0;//初始化 static int noinit; //未初始化 #pragma data_seg() #pragma comment(linker, "/section:.Shared,rws") __declspec(dllexport) LRESULT CALLBACK TestProc(int code, WPARAM wParam, LPARAM lParam) { if (code >= 0) { CWPSTRUCT *msg = (CWPSTRUCT *) lParam; if (msg->message==WM_NULL) { char Text[50]; //進行付值 haveinit=100; noinit=100; sprintf(Text,"haveinit=%d\nnoinit=%d",haveinit,noinit); MessageBox((HWND)msg->wParam,Text,"付值情況",MB_OK); } } return CallNextHookEx(NULL, code, wParam, lParam); } __declspec(dllexport) void Test(HWND hWnd) { char Text[50]; //尋找任意對話框 HWND hTest=FindWindow("#32770",""); //取得對話框的線程句柄 HWND handle=GetWindowThreadProcessId(hTest,NULL); HANDLE hLib= GetModuleHandle("dll.dll"); //添加鈎子 HHOOK hook = SetWindowsHookEx(WH_CALLWNDPROC,TestProc,hLib ,handle); if(hook) { //發送消息激活鈎子 SendMessage(hTest,WM_NULL,(WPARAM)hWnd,0); //解除安裝鈎子 UnhookWindowsHookEx(hook); //輸出結果 sprintf(Text,"haveinit=%d\nnoinit=%d",haveinit,noinit); MessageBox(hWnd,Text,"輸出結果",MB_OK); } } / //res.rc / // // Dialog // ID_DLG DIALOGEX 0, 0, 186, 90 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Dialog" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "測試",IDOK,26,25,50,14 PUSHBUTTON "關閉",IDCANCEL,99,26,50,14 END /// //resource.h #define ID_DLG 101 将上面的dll.c編譯成dll檔案,main.c編譯成exe檔案,程式運作結果便可以說明一切。 |