void FillListBox (HWND hwndList)
这个函数错哪里了?
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
#define ID_LIST   1
#define ID_TEXT   2
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 ("环境变量列表"),
                          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 iLength;
TCHAR *pVarBlock, *pVarBeg, *pVarEnd, *pVarName;
pVarBlock = GetEnvironmentStrings();   
while(*pVarBlock != '\0')
{

if( *pVarBlock!= '=') 
{

pVarBeg = pVarBlock ; 
while(*pVarBlock++ != '='); 
pVarEnd = pVarBlock - 1; 
iLength = pVarEnd - pVarBeg; 
pVarName = (PTCHAR)calloc(iLength+1,sizeof(TCHAR));
CopyMemory(pVarName,pVarBeg,iLength*sizeof(TCHAR));
pVarName[iLength] = '\0';
SendMessage (hwndList, LB_ADDSTRING, 0, (LPARAM) pVarName);
free(pVarName);
}
while(*pVarBlock++!='\0');
}
FreeEnvironmentStrings(pVarBlock);
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     static HWND  hwndList, hwndText ;
     int          iIndex, iLength, cxChar, cyChar ;
     TCHAR      * pVarName, * pVarValue ;
 TCHAR *pVarBlock;
     switch (message)
     {
     case WM_CREATE :
          cxChar = LOWORD (GetDialogBaseUnits ());
          cyChar = HIWORD (GetDialogBaseUnits ());   hwndList = CreateWindow(TEXT("listbox"),NULL,
  WS_CHILD|WS_VISIBLE|LBS_STANDARD,
  cxChar,cyChar*3,cxChar*16+GetSystemMetrics(SM_CXVSCROLL),
  cyChar*5,
  hwnd,(HMENU)ID_LIST,
  (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
  FillListBox(hwndList);
          return 0;
     case WM_DESTROY :
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}

解决方案 »

  1.   


    主要是这部分有问题void FillListBox (HWND hwndList)
    {
    int iLength;
    TCHAR *pVarBlock, *pVarBeg, *pVarEnd, *pVarName;
    pVarBlock = GetEnvironmentStrings();   
    while(*pVarBlock != '\0')
    { if( *pVarBlock!= '=')  
    {pVarBeg = pVarBlock ; 
    while(*pVarBlock++ != '=');  
    pVarEnd = pVarBlock - 1;  
    iLength = pVarEnd - pVarBeg; 
    pVarName = (PTCHAR)calloc(iLength+1,sizeof(TCHAR));
    CopyMemory(pVarName,pVarBeg,iLength*sizeof(TCHAR));
    pVarName[iLength] = '\0';
    SendMessage (hwndList, LB_ADDSTRING, 0, (LPARAM) pVarName);
    free(pVarName);
    }
    while(*pVarBlock++!='\0'); 
    }
    FreeEnvironmentStrings(pVarBlock);
    }
      

  2.   

    while(*pVarBlock != '\0')里面的while循环也要加上不等于'\0'的判断