订阅所有文章
文章搜索

高级搜索这是社么?这是顶尖最新推出的文章增强型搜索功能!
全网 本站
您现在的位置: 顶尖设计 >> IT学院 >> 编程开发 >> VC >> 文章正文

全局共享变量的困惑

作者:ggg82  来源:CSDN  点击  更新:2006-12-19 7:07:36  编辑: 画王w  字体

全局共享变量的困惑

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

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

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

  • 上一篇文章:

  • 下一篇文章:
  •      
    热门文章  
    推荐文章  
    相关文章    
     发表评论
      关于我们 | 联系我们 | 站点地图 | 广告投放 | 友情链接 | 在线留言 | 版权申明
    版权所有 © 2004-2007 顶尖设计(bobd.cn)
    未经授权禁止转载,摘编,复制本站内容或建立镜像. 沪ICP备05002835号