кодовый блок против VS2010 - PullRequest
0 голосов
/ 27 ноября 2010

У меня есть следующий код: -

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
    char ay[256]={0};//HWND hwnd= GetForegroundWindow();
    if( GetClassName(hwnd,ay,256))
    {
        char x[70]={0};
        GetWindowText(hwnd,x,70);
        if(IsWindowVisible(hwnd))
        {
            // CaptureAnImage(hwNd,hwnd);
            HINSTANCE hins= (HINSTANCE) GetWindowLong(hwnd,GWL_HINSTANCE);
            WNDCLASSEX lpwcx;
            GetClassInfoEx(hins,ay,&lpwcx);

            if (MessageBox(0, 
                           strcat(strcat(x, "\r\n"), lpwcx.lpszClassName),
                           "Info", 0x06L) == IDTRYAGAIN)
            {
                return false;
            }
        }
    }
    return true;
}

void cstm()
{
    EnumWindows(EnumWindowsProc,0);
}

Это прекрасно работает на Codeblocks (с компилятором VS 2010 (cl)), но VS2010 дает поврежденное значение lpwcx, я пробовал Unicode, а также Asciiчтобы справиться с этим, но не хороший результат на всех.Первый lpwcx правильный, но позже они возвращают класс не найден (1411), хотя hinstance и имя класса правильные.

Пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 27 ноября 2010
   strcat(strcat(x, "\r\n"), lpwcx.lpszClassName),

Вероятность того, что это приведет к переполнению буфера x и помешает некоторым значениям локальной переменной, например * lpwcx ", очень высока. 70 символов неоправданно скромны.используйте strcat_s (), чтобы хотя бы увеличить его. И да, инициализируйте lpwcx.cbSize

0 голосов
/ 27 ноября 2010

Всегда заполняйте элемент cbSize блоков данных перед вызовом любых функций API. Многие из них полагаются на это значение, чтобы знать, какую версию структуры данных они должны заполнять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...