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

本文介绍如何在DLL和EXE间通过#pragma指令与链接器选项实现全局共享数据的方法,并附带示例代码验证全局变量初始化的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值