GetProcessImageFileName和LPTSTR

时间:2012-02-25 23:59:38

标签: c++ winapi visual-c++

如果我使用它,有人可以说吗?

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

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

我没有使用win32类型, GetProcessImageFileName 的第二个参数需要 LPTSTR typedef,第三个参数需要 DWORD 变量。 如果不是方法,我可能不是正确的方式打印 nameProc 的值? (顺便说一下,它会打印一个空字符串)

提前感谢。

(请尽量避免向我引导一些win32 api文档,我无意了解它,我只需要跟踪一个进程的使用记忆,因此我将不再处理win类型)< / p>

编辑(更新代码):

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 个答案:

答案 0 :(得分:4)

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

LPTSTR nameProc = "";

到此:

TCHAR nameProc[MAX_PATH];

此时通过MAX_PATH传递50。

答案 1 :(得分:4)

你可能不想了解Win32类型(和恕我直言,这是一个非常糟糕的主意,因为在Windows上编程通常API很有用),但即使不了解LPTSTR是什么,MSDN文档也是如此显式关于第二个参数:

  

lpImageFileName [out]

     

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

所以很明显你的nameProc不行,因为你没有为它分配任何内存。你可能想写:

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