Re: Stupid *ptr problems
Howdy wrote:
I am updating an old program and it uses GlobalAlloc() I am expanding
a block of memory to write structure of pointers to what should end up
as an array of pointers.
I don't see anything particular that justifies the use of GlobalAlloc().
malloc() or for C++ std::vector should work just fine.
typedef struct {
LPSTR pszStartDate;
LPSTR pszStartTime;
LPSTR pszEndDate;
LPSTR pszEndTime;
LPSTR pszSystem;
LPSTR pszStatus;
LPSTR pszTaskName;
LPSTR pszTaskDesc;
} QUERYLOG, *PQUERYLOG;
Hmmm, this rather looks like C.
pQueryLog = (PQUERYLOG)GlobalLock(hMem);
nCnt = (int)(GlobalSize(hMem)/sizeof(QUERYLOG));
nCnt--; // zero based array
// * we have the memory, now copy the task.
pQueryLog[nCnt].pszStartDate = _strdup(szStartDate);
pQueryLog[nCnt].pszStartTime = _strdup(szStartTime);
[...]
GlobalUnlock(hMem);
What's the point of using GlobalLock() and GlobalUnlock()?
// * To use the data I do this:
pQueryLog = GlobalLock(hQueryMem);
nRecCnt = (int)(GlobalSize(hQueryMem)/sizeof(QUERYLOG));
// * Insert records into ListView
hWndLV = GetDlgItem(hWndDlg, LV_HISTORY);
for(i=0; i <= nRecCnt; i++)
This looks to me like a buffer overflow, if there are no elements (i.e.
nRecCnt==0) you access one element still.
memset(&lvItem,0,sizeof(lvItem));
lvItem.mask = LVIF_TEXT;
lvItem.cchTextMax = 12;
lvItem.iItem = i;
lvItem.iSubItem = 0;
lvItem.pszText = pQueryLog[nCnt].pszStartDate;
SendMessage(hWndLV,LVM_INSERTITEM,0,(LPARAM)&lvItem);
Beware, the win32 API is TCHAR based while your code assumes CHARs! This
might be a problem in the future but unless you are stupidly applying
casts, the compiler will warn you.
The data displays the exact same way regardless of how I save or
reference the data... I get garbage!!
Divide and conquer! Use OutputDebugString() to output the strings so you can
guarantee that they are right. Use the LVM_INSERTITEM message with fixed
strings to make sure those work.
Uli