VC学习:全局共享变量的困惑

2016-02-19 14:28 31 1 收藏

下面图老师小编跟大家分享一个简单易学的VC学习:全局共享变量的困惑教程,get新技能是需要行动的,喜欢的朋友赶紧收藏起来学习下吧!

【 tulaoshi.com - 编程语言 】

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

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

  下面写两行代码进行验证(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;

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  }
  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];

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

//进行付值
  haveinit=100;
  noinit=100;
  sprintf(Text,"haveinit=%dnoinit=%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=%dnoinit=%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下载。

来源:http://www.tulaoshi.com/n/20160219/1607020.html

延伸阅读
  随着Windows XP和Office XP的推出,兼具华美和清爽气质的Office XP界面风格也逐渐取代了Windows经典界面风格而成为了当前应用程序的流行“时装”,因而如何使自己的应用程序拥有Office XP风格的界面也成为了广大程序员感兴趣的问题。为此法国程序员Jean-Michel LE FOL针对于Visual C++编写了CMenuXP类,使用CMenuXP类就可以轻松使自己的...
  //可以查看按游戏手柄按钮时的情况.   //USB接口的游戏手柄   //编译环境:Windows 2000 server+VC++ 6.0+Win2K DDK   #include   #include   #include   #include   extern "C"   {   #include   }   void main()   {   GUID HidGuid;   // 查找本系...
标签: PHP
在我最近做的一个项目中,我发现了一个新的概念,关于在PHP中使用变量的变量。在我的程序中,我需要在一个页面同时更新多个记录,在我经?嗟背な奔涞耐纯嗨妓髦?螅?院V信既坏厣料殖隽吮淞康谋淞浚?ariable variable)这一概念,所有的困惑就一扫而光了。 介绍 什么叫作变量的变量?根据PHP手册,变量的变量是指取得一个变量的...
    第十篇:模式对话框和通用控件(下) 大家好,雷神由于出差在外,所以笔记今天才写出抱歉。不知道大家有没有做上篇提到的计算器,计算器对雷神来说可是经典的程序,学VB先搞了计算器,学VC也搞了个计算器,前不久在学扩展CBUTTON类时也是用计算器程序,为什么?按钮多呗,雷神最终做出了一个圆形按钮,液晶显示的计...
     第五篇:基本事件处理 我们已经知道MFC库应用程序框架调用CView视图类的虚函数OnDraw来完成屏幕显示。其实CView和CWnd类包含了几百个成员函数,在MSDN中可以看到这些成员函数,其中有许多On开头的,例如第二篇的例子就有一个OnLButtonDown,它们都是应用程序框架响应各种事件所需调用的函数。 OnDraw便...

经验教程

696

收藏

23
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部