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

转运小朱

转运小朱

2016-02-19 14:28

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

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

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

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

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

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

  ///////////////////////////////////////
  //resource.h

  #define ID_DLG 101

  将上面的dll.c编译成dll文件,main.c编译成exe文件,程序运行结果便可以说明一切。

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

展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
VC学习:全局共享变量的困惑

全局共享变量的困惑

编程语言 网络编程
全局共享变量的困惑

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

PHP中的超全局变量

Web开发
PHP中的超全局变量

Linux全局变量jiffies的用法

电脑入门
Linux全局变量jiffies的用法

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

解析VC中创建DLL,导出全局变量,函数和类的深入分析

编程语言 网络编程
解析VC中创建DLL,导出全局变量,函数和类的深入分析

深入uCOS中全局变量的使用详解

编程语言 网络编程
深入uCOS中全局变量的使用详解

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

在ListCtrl中进行排序

在ListCtrl中进行排序

怎么看自己qq被关联

怎么看自己qq被关联
下拉加载更多内容 ↓