天天看点

DLL和EXE怎样共享全局变量?

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文件,程序运行结果便可以说明一切。