博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于《Windows程序设计(第五版)》中一个实例程序的疑问
阅读量:4655 次
发布时间:2019-06-09

本文共 5341 字,大约阅读时间需要 17 分钟。

     最近一直在看Charlse Petzold的《Windows程序设计》,作为一个新得不能再新的新手,只能先照着书的抄抄源码了,之前的例子一直都很正常,但昨天遇到一个很诡异的BUG。

先看实例源码吧:

1 /*-----------------------------------------------------------------  2         ENVIRON.C -- Environment List Box  3         (c) Charles Petzold,1998  4         Copy by XXXX,2015/1/26  5 ------------------------------------------------------------------*/  6   7 #include 
8 9 #define ID_LIST 1 10 #define ID_TEXT 2 11 12 LRESULT CALLBACK WndProc(HWND hwnd, UINT, WPARAM, LPARAM); 13 14 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) 15 { 16 static TCHAR szAppName[] = TEXT("Environ"); 17 HWND hwnd; 18 MSG msg; 19 WNDCLASS wndclass; 20 21 wndclass.style = CS_VREDRAW | CS_HREDRAW; 22 wndclass.lpfnWndProc = WndProc; 23 wndclass.cbClsExtra = 0; 24 wndclass.cbWndExtra = 0; 25 wndclass.hInstance = hInstance; 26 wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); 27 wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); 28 wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 29 wndclass.lpszMenuName = NULL; 30 wndclass.lpszClassName = szAppName; 31 32 if (!RegisterClass(&wndclass)) 33 { 34 MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR); 35 return 0; 36 } 37 38 hwnd = CreateWindow(szAppName, TEXT("Environment List Box"), WS_OVERLAPPEDWINDOW, 39 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); 40 ShowWindow(hwnd, iCmdShow); 41 UpdateWindow(hwnd); 42 43 while (GetMessage(&msg, NULL, 0, 0)) 44 { 45 TranslateMessage(&msg); 46 DispatchMessage(&msg); 47 } 48 return msg.wParam; 49 } 50 51 52 void FillListBox(HWND hwndList) 53 { 54 int iLength; 55 TCHAR * pVarBlock, *pVarBeg, *pVarEnd, *pVarName; 56 pVarBlock = GetEnvironmentStrings(); //Get pointer to environment block 57 58 while (*pVarBlock) 59 { 60 if (*pVarBlock != '=') //Skip variable names begining with '=' 61 { 62 pVarBeg = pVarBlock; //Beging of variable name 63 while (*(pVarBlock++) != '='); //Scan until '=' 64 pVarEnd = pVarBlock - 1; //Points to '=' sign 65 iLength = pVarEnd - pVarBeg; //Length of variable name 66 67 //Allocate memory for the variable name and terminating 68 //zero.Copy the variable name and append a zero 69 pVarName = calloc(iLength + 1, sizeof(TCHAR)); 70 CopyMemory(pVarName, pVarBeg, iLength * sizeof(TCHAR)); 71 pVarName[iLength] = '\0'; 72 73 //Put the variable name int the list box and free memory 74 SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)pVarName); 75 free(pVarName); 76 } 77 while (*pVarBlock++ != '\0'); //Scna until terminating zero 78 79 } 80 FreeEnvironmentStrings(pVarBlock); 81 int code; 82 code = GetLastError(); 83 } 84 85 86 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 87 { 88 static HWND hwndList, hwndText; 89 int iIndex, iLength, cxChar, cyChar; 90 TCHAR * pVarName, *pVarValue; 91 92 switch (message) 93 { 94 case WM_CREATE: 95 cxChar = LOWORD(GetDialogBaseUnits()); 96 cyChar = HIWORD(GetDialogBaseUnits()); 97 98 //Create listbox and static text windows 99 hwndList = CreateWindow(TEXT("listbox"), NULL, WS_CHILD | WS_VISIBLE | LBS_STANDARD,100 cxChar, cyChar * 3, cxChar * 16 + GetSystemMetrics(SM_CXVSCROLL), cyChar * 5, hwnd,101 (HMENU)ID_LIST, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);102 hwndText = CreateWindow(TEXT("static"), NULL, WS_CHILD | WS_VISIBLE | SS_LEFT, cxChar, cyChar,103 GetSystemMetrics(SM_CXSCREEN), cyChar, hwnd, (HMENU)ID_TEXT,104 (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);105 FillListBox(hwndList);106 return 0;107 108 109 case WM_SETFOCUS:110 SetFocus(hwndList);111 return 0;112 113 114 case WM_COMMAND:115 if (LOWORD(wParam) == ID_LIST&&HIWORD(wParam) == LBN_SELCHANGE)116 {117 //Get current selectiong118 iIndex = SendMessage(hwndList, LB_GETCURSEL, 0, 0);119 iLength = SendMessage(hwndList, LB_GETTEXTLEN, iIndex, 0) + 1;120 pVarName = calloc(iLength, sizeof(TCHAR));121 SendMessage(hwndList, LB_GETTEXT, iIndex, (LPARAM)pVarName);122 123 //Get environment string124 iLength = GetEnvironmentVariable(pVarName, NULL, 0);125 pVarValue = calloc(iLength, sizeof(TCHAR));126 GetEnvironmentVariable(pVarName, pVarValue, iLength);127 128 //Show it in window129 SetWindowText(hwndText, pVarValue);130 free(pVarName);131 free(pVarValue);132 }133 return 0;134 135 136 case WM_DESTROY:137 PostQuitMessage(0);138 return 0;139 }140 return DefWindowProc(hwnd, message, wParam, lParam);141 }

编译什么的都没有错误提示,但是在本地调试时提示触发一个断点,但是我确定我没有下过断点!!!

提示如图:

选择“继续”后会又提示一个中断,提示堆被损坏

作为一个小彩笔,真心弄不懂,求教大牛!!!

转载于:https://www.cnblogs.com/lyfh/p/4254344.html

你可能感兴趣的文章
FIREDAC TFDCONNECTION连接ORACLE
查看>>
【LeetCode从零单排】No 114 Flatten Binary Tree to Linked List
查看>>
Effective Go(官方文档)笔记
查看>>
Spring表达式语言SpEL简单介绍
查看>>
NancyFX 第八章 内容协商
查看>>
操蛋的一天
查看>>
20172324 2017-2018-2 《程序设计与数据结构》第八周学习总结
查看>>
Dao层设计
查看>>
css各种姿势的水平居中
查看>>
MYSQL 测试常用语句使用技巧
查看>>
基础细节知识
查看>>
树状数组求区间最大值
查看>>
从面试官角度来告诉大家,哪些人能面试成功
查看>>
以我的亲身经历为例,告诉大家写简历和面试的技巧(面向高级开发和架构师)...
查看>>
一个简单的PHP网站结构
查看>>
Redis 学习之简介及安装
查看>>
jsp简单的学习
查看>>
[LeetCode][JavaScript]Number of 1 Bits
查看>>
[LeetCode][JavaScript]Plus One
查看>>
C语言-06复杂数据类型-01数组
查看>>