GetProcessImageFileName and LPTSTR

GetProcessImageFileName and LPTSTR

本文关键字:LPTSTR and GetProcessImageFileName      更新时间:2023-10-16

有人可以说我用对了吗?

LPTSTR nameProc = "";
...
GetProcessImageFileName( hProcess, nameProc, 50 );
printf("name process : %sn", nameProc);

我不习惯win32类型,GetProcessImageFileName的第二个参数需要LPTSTRtypedef,第三个参数使用DWORD变量。如果不是方法,也许我没有以正确的方式打印nameProc的值?(顺便打印一个空字符串)

提前谢谢。

(请尽量避免让我看到一些win32api文档,我无意了解它,我只需要跟踪一个进程的使用内存,因此我不再处理win类型)

EDIT(更新代码):

void printMemoryInfo( DWORD processID ) {
    HANDLE hProcess;
    TCHAR nameProc[MAX_PATH];
    printf("nProcess ID: %un", 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("errorn");
    else printf("%sn", 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;
}

nameProc需要是一个可变缓冲区,因为它是一个输出参数,目前它可能只是崩溃。更改此项:

LPTSTR nameProc = "";

到此:

TCHAR nameProc[MAX_PATH];

同时通过MAX_PATH,此时您正通过50。

您可能不想了解Win32类型(和IMHO,这是一个很糟糕的主意,因为在Windows上编程通常API很有用),但即使不了解什么是LPTSTR,MSDN文档也非常明确地介绍了第二个参数:

lpImageFileName[out]

 nbsp nbsp nbsp nbsp;指向缓冲区的指针,该缓冲区接收可执行文件的完整路径。

很明显,你的nameProc是不好的,因为你没有为它分配任何内存

TCHAR nameProc[MAX_PATH];
if(GetProcessImageFileName(hProcess, nameProc, sizeof(nameProc)/sizeof(*nameProc))==0)
{
    // some error happened
}