• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

全局共享变量的困惑

发布: 2007-7-01 20:40 | 作者: admin | 来源: | 查看: 11次 | 进入软件测试论坛讨论

领测软件测试网

全局共享变量的困惑

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

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

下面写两行代码进行验证(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文件,程序运行结果便可以说明一切。

以上代码可以通过网址下载。


文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网