CSDN博客

img ggg82

全局共享变量的困惑

发表于2004/2/4 10:00:00  1022人阅读

全局共享变量的困惑

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

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

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

0 0

相关博文

我的热门文章

img
取 消
img