windows程序设计 第九章 ENVIRON.C中的一个问题
来源:互联网 发布:avi封装软件 编辑:程序博客网 时间:2024/06/05 15:27
#include <windows.h>#define ID_LISTBOX 1#define ID_TEXTBOX 2LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow){static TCHAR szAppName[] = TEXT ("Environ") ;HWND hwnd ;MSG msg ;WNDCLASS wndclass ;wndclass.style = CS_HREDRAW | CS_VREDRAW ;wndclass.lpfnWndProc = WndProc ;wndclass.cbClsExtra = 0 ;wndclass.cbWndExtra = 0 ;wndclass.hInstance = hInstance ;wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;wndclass.hbrBackground = (HBRUSH) (COLOR_WINDOW+1) ;wndclass.lpszMenuName = NULL ;wndclass.lpszClassName = szAppName ;if (!RegisterClass (&wndclass)){MessageBox ( NULL, TEXT ("This program requires Windows NT!"),szAppName, MB_ICONERROR) ;return 0 ;}hwnd = CreateWindow (szAppName, TEXT ("this is ENVIRON program"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL) ;ShowWindow (hwnd, iCmdShow) ;UpdateWindow (hwnd) ;while (GetMessage (&msg, NULL, 0, 0)){TranslateMessage (&msg) ;DispatchMessage (&msg) ;}return msg.wParam ;}void FillListBox(HWND hwndList){int iLength1;TCHAR *pVarBlock,*pVarBeg,*pVarEnd,*pVarName,*pVarBlock1;pVarBlock=pVarBlock1=GetEnvironmentStrings();while(*pVarBlock){if(*pVarBlock != '='){pVarBeg=pVarBlock;while(*pVarBlock++ != '=');pVarEnd=pVarBlock-1;iLength1=pVarEnd-pVarBeg;pVarName=(TCHAR*)calloc(iLength1+1,sizeof(TCHAR));CopyMemory(pVarName,pVarBeg,iLength1*sizeof(TCHAR));pVarName[iLength1]='\0';SendMessage(hwndList,LB_ADDSTRING,0,(LPARAM)pVarName);free(pVarName);}while(*pVarBlock++ != '\0');}FreeEnvironmentStrings(pVarBlock1);}LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { static HWND hwndList,hwndText;int cxChar,cyChar;int iLength,iIndex;TCHAR *pVarName1,*pVar; switch(message){case WM_CREATE:cxChar=LOWORD(GetDialogBaseUnits());cyChar=HIWORD(GetDialogBaseUnits());hwndList=CreateWindow(TEXT("listbox"),NULL,WS_CHILD | WS_VISIBLE | LBS_STANDARD,cxChar,3*cyChar,16*cxChar,cyChar*10,hwnd,(HMENU) ID_LISTBOX,(HINSTANCE) GetWindowLong(hwnd,GWL_HINSTANCE),NULL);hwndText=CreateWindow(TEXT("static"),NULL,WS_CHILD | WS_VISIBLE | SS_LEFT,cxChar,cyChar,GetSystemMetrics(SM_CXSCREEN),cyChar,hwnd,(HMENU) ID_TEXTBOX,(HINSTANCE) GetWindowLong(hwnd,GWL_HINSTANCE),NULL);FillListBox(hwndList);return 0;case WM_SETFOCUS:SetFocus(hwndList);return 0;case WM_COMMAND:if(LOWORD(wParam)==ID_LISTBOX && HIWORD(wParam)==LBN_SELCHANGE){iIndex=SendMessage(hwndList,LB_GETCURSEL,0,0);iLength=SendMessage(hwndList,LB_GETTEXTLEN,iIndex,0)+1;pVarName1=(TCHAR*) calloc(iLength,sizeof(TCHAR));SendMessage(hwndList,LB_GETTEXT,iIndex,(LPARAM)pVarName1);iLength=GetEnvironmentVariable(pVarName1,NULL,0);pVar=(TCHAR*) calloc(iLength,sizeof(TCHAR));GetEnvironmentVariable(pVarName1,pVar,iLength);SetWindowText(hwndText,pVar);free (pVarName1);free (pVar);}return 0;case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd,message,wParam,lParam);}
笔者按照书中的代码调试(F5)总是出现
“ Windows 已在 ENVIRON1.exe 中触发一个断点。其原因可能是堆被损坏,这说明 ENVIRON1.exe 中或它所加载的任何 DLL 中有 Bug。。”
这个应该内存释放出现了问题,检查发现书中代码在
FreeEnvironmentStrings(pVarBlock);有问题,因为pVarBlock在
while(*pVarBlock++ != '=');
while(*pVarBlock++ != '\0');值已经改变了,不能利用该指针进行内存释放,本文中利用pVarBlock1进行内存的释放。
另注:
运行本程序时,总是出现“LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏”这个问题,网上已有解决方案:项目\属性\配置属性\清单工具\输入和输出\嵌入清单:原来是“是”,改成“否”。不过每次创建新项目总是要重新设置一遍。
0 0
- windows程序设计 第九章 ENVIRON.C中的一个问题
- 《windows 程序设计》第九章 一个迷惑解答
- Objective-C 程序设计 第九章
- C/C++ Unix中的环境变量environ
- environ.c
- 关于windows程序设计 列表框类 ——environ
- 《Windows程序设计-第二版》第四章最后一个04Clock大例子中的GDI句柄泄漏问题
- 第九章 DLL windows程序设计 王艳平版
- 第九章 hook windows程序设计 王艳平版
- 第九章 HOOK程序测试 windows程序设计 王艳平版
- 第九章 HOOKDLL windows程序设计王艳平版
- 第九章 DLL文件 windows程序设计 王艳平版
- 第九章 导入表程序 windows程序设计 王艳平版
- 第九章 keyhook windows程序设计王艳平版
- 第九章 keyhookdll windows程序设计王艳平版
- c 环境变量 environ变量
- Linux程序设计第九章
- C和指针--第九章_问题
- @注解_继承映射
- 传感器节点分布图绘制-matlab
- Git入门指南十一:Git branch 分支与合并分支
- java集合之迭代器ListIterator
- NYOJ540 奇怪的排序
- windows程序设计 第九章 ENVIRON.C中的一个问题
- Linux学习(一)--简介
- 欧几里得算法
- C#正则表达式大全
- Linux环境变量的设置和查看方法
- c与lua交互 二
- 在Eclipse中使用SVN
- @注解_唯一约束
- 第十三章 Spring注入集合(Spring Framework3.1教程)