VOID 
GetProcessNameByID(
DWORD dwProcessID,
WCHAR szProcessName[]
)
{
HANDLE   hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 
PROCESSENTRY32  pe; 
::ZeroMemory(&pe,sizeof(pe)); 
pe.dwSize = sizeof(pe); 
BOOL bMore = ::Process32First(hSnapshot,&pe); 
while(bMore){ 
if(pe.th32ProcessID == dwProcessID){ 
StrCpy(szProcessName, pe.szExeFile);
break; 
}
else{
bMore = ::Process32Next(hSnapshot,&pe); 
}
}
}
调用代码:
CString szProcessName;
GetProcessNameByID(processid, szProcessName.GetBuffer()); 这样是正常的,但是我把函数变换一下,第二个参数变成CString,
StrCpy(szProcessName, pe.szExeFile)这行也换成StrCpy(szProcessName.GetBuffer(), pe.szExeFile);
调用的时候是GetProcessNameByID(processid, szProcessName); 
结果函数执行完后报错,不明所以,求解。

解决方案 »

  1.   

    szProcessName = pe.szExeFile;
      

  2.   

    没事别乱用GetBuffer,我很少看见有人用对了的。
    特别是仅仅是读取CString内容的时候,用GetBuffer是不专业的,虽然可能运行结果是对的。你这个例子,CString内容可能都还没有分配内存,或者内存不足。
    一般比较忌讳把一个类里面的成员取出来,用crt(或者类似的)函数去操作,如果真的有这种需要,那么类一定会提供相应的接口的。
      

  3.   

    GetBuffer()调用以后,需要调用ReleaseBuffer()后方可再使用CString 的成员函数。如果你要得到char* 可以这样转行(char*)(LPCTSTR)szProcessName