Printf зависает программа без ответа - PullRequest
1 голос
/ 06 октября 2019

Этот код получает и печатает все заголовки окон и hwnd. Однако есть проблема с этой строкой кода:

printf("----%s\n",hwndTitlePtrCollection[idx-1]);

Если я удаляю эту строку, приложение работает нормально, иначе оно застревает.

#include <stdio.h>
#include <stdlib.h>
#define WINVER 0x0600
#define _WIN32_IE 0x0500
#include <windows.h>
#include <stdint.h>
uint64_t* hwndCollection;
char**    hwndTitlePtrCollection;
uint64_t  idx;
BOOL CALLBACK WindowFoundCB(HWND hwnd, char* param) {
    char *strIn2 = (char*) param;
    char *strIte;
    GetWindowText(hwnd, strIte, 256);
    if (IsWindowVisible(hwnd)){
       idx++;

       hwndCollection = (uint64_t *)realloc(hwndCollection,idx*sizeof(uint64_t));
       hwndCollection[idx-1] =  hwnd;
       printf("**** get a window's number ****\n");
       printf("----%d----%d\n",hwnd,hwndCollection[idx-1]);

       hwndTitlePtrCollection = (char**)realloc(hwndTitlePtrCollection,idx*sizeof(char*));
       hwndTitlePtrCollection[idx-1] = strIte;
       printf("**** get a window's Title ****\n");
       // this line if delete, runs OK. If exist, got stuck here
       printf("----%s\n",hwndTitlePtrCollection[idx-1]);
    }
    return TRUE;
}
int main()
{
    printf("Hello world!\n");
    idx = 0;
    char* aStr = "good";
    hwndCollection = (uint64_t*)malloc(sizeof(uint64_t)*1);
    hwndTitlePtrCollection = (char**)malloc(sizeof(char*)*1);
    EnumWindows(WindowFoundCB,&aStr);
    printf("total query recorded is: %d\n",idx);
    return 0;
}

1 Ответ

1 голос
/ 06 октября 2019

Я удивлен, что код достигает строки, которую вы упомянули - возможно, просто удача - потому что у вас есть серьезные ошибки в другом месте. Это приведет к неопределенному поведению . Смотрите комментарии и исправления в приведенном ниже коде:

BOOL CALLBACK WindowFoundCB(HWND hwnd, char* param) {
    char *strIn2 = (char*) param;
//  char *strIte; // You are not actually allocating any memory here!
    char strIte[256]; // This way, you have allocated 256 bytes for the Window name.
    GetWindowText(hwnd, strIte, 256); // In the uncorrected version, this is UB!
    if (IsWindowVisible(hwnd)){
        idx++;

        hwndCollection = (uint64_t *)realloc(hwndCollection,idx*sizeof(uint64_t));
        hwndCollection[idx-1] =  hwnd;
        printf("**** get a window's number ****\n");
        printf("----%d----%d\n",hwnd,hwndCollection[idx-1]);

        // EDIT (1a)!
        // The following line allocates pointers to strings, but no memory for the strings...
        hwndTitlePtrCollection = (char**)realloc(hwndTitlePtrCollection,idx*sizeof(char*));
        // Here, we allocate memory for the new string …
        // EDIT (1b)!
        hwndTitlePtrCollection[idx-1] = malloc(256 * sizeof(char));
    //  hwndTitlePtrCollection[idx-1] = strIte; // Wrong! This just copies the pointer...
        strcpy(hwndTitlePtrCollection[idx-1], strIte); // ...this copies the contents.
        printf("**** get a window's Title ****\n");
        // this line if delete, runs OK. If exist, got stuck here
        printf("----%s\n",hwndTitlePtrCollection[idx-1]);
    }
    return TRUE;
}

Попробуйте это (могут быть и другие ошибки, но давайте разберемся с этим)! Не стесняйтесь просить дальнейших объяснений и / или разъяснений.

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