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
近日写程序,让全局共享变量给害苦了,现将结果公布出来,不希望有人步我后尘。 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文件,程序运行结果便可以说明一切。 |