小弟在學習《windows程式設計》第五版時,在除錯第10章(資源與其它資源)的POEPOEM.C程式時,遇到這個問題:“0xC0000005: 寫入位置 0x0036BC7A 時發生訪問沖突”。
1、工具:visual studio 2013
2、在除錯到108行代碼時;*PText = ’\0'; 無法執行

3、”AnnabelLee"表示一個TXT文本資源;該文本資源以反斜杠結尾。
4、hResource是指向文本資源記憶體塊的句柄;
5、指標PText指向記憶體中的文本字串;


6、源代碼,資源檔案都是和書上一模一樣,
為什么*PText = '\0'為什么就不執行不了啊?
為什么 0x0036BC7A 處的值不能被修改啊?
如果跳過108行,往下執行就能除錯成功,但最后顯示在視窗上的文本就是以反斜杠結尾的。
以下是POEPOEM.C全部代碼:
/*-------------------------------------------
POEPOEM.C -- Demonstrates Custom Resource
(c) Charles Petzold, 1998
-------------------------------------------*/
#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE hInst;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
TCHAR szAppName[16], szCaption[64], szErrMsg[64];
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
LoadString(hInstance, IDS_APPNAME, szAppName,
sizeof(szAppName) / sizeof(TCHAR));
LoadString(hInstance, IDS_CAPTION, szCaption,
sizeof(szCaption) / sizeof(TCHAR));
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(hInstance, szAppName);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
if (!RegisterClass(&wndclass))
{
LoadStringA(hInstance, IDS_APPNAME, (char *)szAppName,
sizeof(szAppName));
LoadStringA(hInstance, IDS_ERRMSG, (char *)szErrMsg,
sizeof(szErrMsg));
MessageBoxA(NULL, (char *)szErrMsg,
(char *)szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindow(szAppName, szCaption,
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
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;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static char * pText;
static HGLOBAL hResource;
static HWND hScroll;
static int iPosition, cxChar, cyChar, cyClient, iNumLines, xScroll;
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
TEXTMETRIC tm;
TCHAR zp;
switch (message)
{
case WM_CREATE:
hdc = GetDC(hwnd);
GetTextMetrics(hdc, &tm);
cxChar = tm.tmAveCharWidth;
cyChar = tm.tmHeight + tm.tmExternalLeading;
ReleaseDC(hwnd, hdc);
xScroll = GetSystemMetrics(SM_CXVSCROLL);
hScroll = CreateWindow(TEXT("scrollbar"), NULL,
WS_CHILD | WS_VISIBLE | SBS_VERT,
0, 0, 0, 0,
hwnd, (HMENU)1, hInst, NULL);
hResource = LoadResource(hInst,
FindResource(hInst, TEXT("AnnabelLee"),
TEXT("TEXT")));
pText = (char *)LockResource(hResource);
iNumLines = 0;
while (*pText != '\\' && *pText != '\0')
{
if (*pText == '\n')
iNumLines++;
pText = AnsiNext(pText);
}
*pText = '\0';
SetScrollRange(hScroll, SB_CTL, 0, iNumLines, FALSE);
SetScrollPos(hScroll, SB_CTL, 0, FALSE);
return 0;
case WM_SIZE:
MoveWindow(hScroll, LOWORD(lParam) - xScroll, 0,
xScroll, cyClient = HIWORD(lParam), TRUE);
SetFocus(hwnd);
return 0;
case WM_SETFOCUS:
SetFocus(hScroll);
return 0;
case WM_VSCROLL:
switch (wParam)
{
case SB_TOP:
iPosition = 0;
break;
case SB_BOTTOM:
iPosition = iNumLines;
break;
case SB_LINEUP:
iPosition -= 1;
break;
case SB_LINEDOWN:
iPosition += 1;
break;
case SB_PAGEUP:
iPosition -= cyClient / cyChar;
break;
case SB_PAGEDOWN:
iPosition += cyClient / cyChar;
break;
case SB_THUMBPOSITION:
iPosition = LOWORD(lParam);
break;
}
iPosition = max(0, min(iPosition, iNumLines));
if (iPosition != GetScrollPos(hScroll, SB_CTL))
{
SetScrollPos(hScroll, SB_CTL, iPosition, TRUE);
InvalidateRect(hwnd, NULL, TRUE);
}
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
pText = (char *)LockResource(hResource);
GetClientRect(hwnd, &rect);
rect.left += cxChar;
rect.top += cyChar * (1 - iPosition);
DrawTextA(hdc, pText, -1, &rect, DT_EXTERNALLEADING);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
FreeResource(hResource);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
uj5u.com熱心網友回復:
資源檔案匯入的時候,沒有結尾的 \0 的,所以你寫入最后的那個 '\0',超出范圍了。uj5u.com熱心網友回復:
記憶體越界了吧,查一查pText指向的記憶體是多大uj5u.com熱心網友回復:
你while回圈完了之后,pText指到哪兒去了?還在屬于自己的那塊記憶體區域中嗎?uj5u.com熱心網友回復:
崩潰的時候在彈出的對話框按相應按鈕進入除錯,按Alt+7鍵查看Call Stack即“呼叫堆疊”里面從上到下列出的對應從里層到外層的函式呼叫歷史。雙擊某一行可將游標定位到此次呼叫的源代碼或匯編指令處,看不懂時雙擊下一行,直到能看懂為止。uj5u.com熱心網友回復:
操作的字串是常量字串還是一個陣列標識,還是string,如果直接寫常量字串,保存在字符常量區,無法修改的uj5u.com熱心網友回復:
我也遇到了一樣了問題,lz解決沒有?uj5u.com熱心網友回復:
#pragma comment(linker,"/SECTION:.rdata,RW")//加這句可以讓常量區可寫,后果自負!
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/96795.html
標籤:基礎類
上一篇:如何列舉當前系統安裝的語言包?
