全局共享变量的困惑

原创 2004年02月04日 10:00:00

全局共享变量的困惑

近日写程序,让全局共享变量给害苦了,现将结果公布出来,不希望有人步我后尘。

先总结经验:全局共享变量一定要在定义时初始化,否则无效。

下面写两行代码进行验证(Visual Studio .NET 2003 + Windows Servers 2003):

////////////////////////////
//main.c

#include <windows.h>
#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 <windows.h>
#include <studio.h>

//定义全局共享变量
#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文件,程序运行结果便可以说明一切。

以上代码可以通过网址http://ggg82.go.nease.net/document/g_shared.rar下载。

Servlet共享变量与作用域

Servlet可以使用setAttribute("name","value")来设置共享变量的名称和变量的值。其他Servlet可以通过调用getAttribute("name")来获取name所对应...
  • haqer0825
  • haqer0825
  • 2011年05月16日 10:14
  • 2898

语言模型的评估-困惑度

语言模型评价 语言模型构造完成后,如何确定好坏呢? 目前主要有两种评价方法: 实用方法:通过查看该模型在实际应用(如拼写检查、机器翻译)中的表现来评价,优点是直观、实用,缺点是缺乏针对性、...
  • lujiandong1
  • lujiandong1
  • 2016年11月21日 15:25
  • 5160

蓝桥杯 Torry的困惑(基本型)(java题解)

问题描述   Torry从小喜爱数学。一天,老师告诉他,像2、3、5、7……这样的数叫做质数。Torry突然想到一个问题,前10、100、1000、10000……个质数的乘积是多少呢?他把这个问题告...
  • qq_15370821
  • qq_15370821
  • 2016年06月02日 10:16
  • 332

学习中的困惑

已经很长时间没有进行更新了,感觉写不出来什么了。这些天一直在反思在学习过程中哪里出现了问题,第一点原因:浮躁。我一天要学习三四个小时,然而总是“看”而未注重“学”,看视频的时候没有做好笔记导致写博客的...
  • Hanfeng_1999
  • Hanfeng_1999
  • 2016年06月01日 16:46
  • 838

全局共享变量(Android)

在安卓中一种比较好的储存全局共享变量的方法是继承Application,将全局变量写入继承的Application类中,然后在Activity或Service中通过getApplication()方法...
  • syfyw
  • syfyw
  • 2012年11月22日 22:05
  • 1767

2016蓝桥杯算法训练——Torry的困惑(基本型)

算法训练 Torry的困惑(基本型)   问题描述   Torry从小喜爱数学。一天,老师告诉他,像2、3、5、7……这样的数叫做质数。Torry突然想到一个问题,前10、100、10...
  • qq_21385857
  • qq_21385857
  • 2016年02月16日 15:41
  • 691

MapReduce Job 全局共享数据

编写MapReduce代码时候,全局变量应该如何保存? 1. 读写HDFS文件。 2. 配置job属性。 3.使用DistributedCache。...
  • u012587561
  • u012587561
  • 2015年08月22日 01:06
  • 1183

2017.06.22:LDA与困惑度代码

LDA代码: class LDAModel(object): def __init__(self, dpre): self.dpre = dpre # 获取预处理参数 # # 模...
  • coco_cai
  • coco_cai
  • 2017年06月22日 11:12
  • 672

python 多进程共享变量

现在要读取多个数据文件从中抽取数据将结果合并(相当于word count) 方法一是常规的分多线程分别处理数据输出,最后定义一个字典遍历输出文件将结果集合并 方法二是先定义结果集字典,然后...
  • xys228280987
  • xys228280987
  • 2015年11月19日 11:31
  • 4409

[Sdoi2008]沙拉公主的困惑

【问题描述】 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票。房地产第一大户沙拉公主决定预测一下大富翁国现在所有真...
  • Balala_Energy
  • Balala_Energy
  • 2016年05月29日 14:10
  • 405
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:全局共享变量的困惑
举报原因:
原因补充:

(最多只允许输入30个字)