C++ GetProcessImageFileName和LPTSTR

C++ GetProcessImageFileName和LPTSTR,c++,winapi,visual-c++,C++,Winapi,Visual C++,有人能说我用对了吗 LPTSTR nameProc = ""; ... GetProcessImageFileName( hProcess, nameProc, 50 ); printf("name process : %s\n", nameProc); 我不习惯win32类型, GetProcessImageFileName的第二个参数需要一个LPTSTRtypedef,第三个参数需要一个DWORD变量。 如果不是该方法,可能我没有以正确的方式打印nameProc的值?(顺便说一下,它会打

有人能说我用对了吗

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

printf("name process : %s\n", nameProc);
我不习惯win32类型, GetProcessImageFileName的第二个参数需要一个LPTSTRtypedef,第三个参数需要一个DWORD变量。 如果不是该方法,可能我没有以正确的方式打印nameProc的值?(顺便说一下,它会打印一个空字符串)

提前谢谢

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

编辑(更新代码):

void printmoryInfo(DWORD processID){
处理hProcess;
TCHAR nameProc[MAX_PATH];
printf(“\n进程ID:%u\n”,进程ID);
hProcess=OpenProcess(进程查询信息、进程虚拟机读取、假、进程ID);
if(hProcess==NULL)返回;
if(GetProcessImageFileName(hProcess,nameProc,sizeof(nameProc)/sizeof(*nameProc))==0)
printf(“错误\n”);
else printf(“%s\n”,nameProc);
}
内部主(空){
DWORD APROCESS[1024],CBREQUIRED,CPROCESS;
无符号整数i;
if(!EnumProcesses(a进程、sizeof(a进程)和cbNeeded)){
返回1;
}
cprocess=cbNeeded/sizeof(DWORD);
对于(i=0;i
nameProc
需要是一个可变缓冲区,因为它是一个输出参数,目前可能只是崩溃。更改此项:

LPTSTR nameProc = "";
为此:

TCHAR nameProc[MAX_PATH];

也要通过当前通过50的路径。

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

lpImageFileName[输出]

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

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

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

谢谢,它适用于某些进程标识符。它似乎不希望打印我在其中执行该程序的进程的文件名(但事实上,processId位于使用enumProcesses初始化的列表中)。知道为什么吗?你能更新你的帖子以包含枚举进程的代码吗。@Oddant尝试更改
TCHAR nameProc[50]
TCHAR nameProc[MAX_PATH]。你的缓冲区太小了。
TCHAR nameProc[MAX_PATH];
if(GetProcessImageFileName(hProcess, nameProc, sizeof(nameProc)/sizeof(*nameProc))==0)
{
    // some error happened
}