GetProcessImageFileName и LPTSTR - PullRequest
       0

GetProcessImageFileName и LPTSTR

0 голосов
/ 26 февраля 2012

Кто-то может сказать, правильно ли я это использую?

LPTSTR nameProc = "";
...
GetProcessImageFileName( hProcess, nameProc, 50 );

printf("name process : %s\n", nameProc);

Я не использую типы win32, 2-й аргумент GetProcessImageFileName требует LPTSTR typedef и третий принимает переменную DWORD .если не метод, может быть, я не печатаю значение nameProc правильным способом?(кстати, печатает пустую строку)

спасибо заранее.

(пожалуйста, постарайтесь не приводить меня к некоторым документам Win32 API, я не собираюсь об этом узнавать, я простонеобходимо отслеживать память использования одного процесса, поэтому я больше не буду иметь дело с типами выигрышей)

РЕДАКТИРОВАТЬ (обновленный код):

void printMemoryInfo( DWORD processID ) {

    HANDLE hProcess;
    TCHAR nameProc[MAX_PATH];

    printf("\nProcess ID: %u\n", processID);

    hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID );

    if (hProcess == NULL) return;

    if (GetProcessImageFileName( hProcess, nameProc, sizeof(nameProc)/sizeof(*nameProc) )==0)
        printf("error\n");

    else printf("%s\n", nameProc);
}

int main (void) {

    DWORD aProcesses[1024], cbNeeded, cProcesses;
    unsigned int i;

    if (!EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded )) {

        return 1;
    }

    cProcesses = cbNeeded/sizeof(DWORD);

    for (i=0; i < cProcesses; i++) {

    printMemoryInfo( aProcesses[i] );
    }

    return 0;
}

Ответы [ 2 ]

4 голосов
/ 26 февраля 2012

Возможно, вы не захотите узнавать о типах Win32 (и ИМХО, это довольно плохая идея, поскольку программирование под Windows часто бывает полезным для API), но даже не понимая, что такое LPTSTR, документация MSDN довольно явно описываетвторой параметр:

lpImageFileName [out]

Указатель на буфер, который получает полный путь к исполняемому файлу.

Итак, совершенно очевидно, что ваш nameProc не в порядке, так как вы не выделяете для него память.Возможно, вы захотите написать:

TCHAR nameProc[MAX_PATH];
if(GetProcessImageFileName(hProcess, nameProc, sizeof(nameProc)/sizeof(*nameProc))==0)
{
    // some error happened
}
4 голосов
/ 26 февраля 2012

nameProc должен быть изменяемым буфером, так как он является выходным параметром, в настоящий момент он, вероятно, просто потерпит крах. Изменить это:

LPTSTR nameProc = "";

к этому:

TCHAR nameProc[MAX_PATH];

Также передайте MAX_PATH, где вы проходите 50 в данный момент.

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