背景
首先代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include "stdint.h"
#include <windows.h>
#include <tchar.h>
#include <TlHelp32.h>
#include <io.h>
#include <sys/stat.h>
using namespace std;
//获取进程个数函数
int GetProcessCount(TCHAR* szExeName)
{
//具体代码省略
}
int main()
{
string ProName = "Agent状态监视软件.exe";
TCHAR t_str[200] = { 0 };
char str[100] = { 0 };
memcpy(str, ProName.c_str(), ProName.length());
MultiByteToWideChar(CP_ACP, 0, str, -1, t_str, 200);
TCHAR* szExeName = t_str;
cout << "进程个数:"<<GetProcessCount(szExeName) << endl;
system("pause");
return 0;
}
输出很正常,进程个数:1
问题
但是,我想将string 类型转为TCHAR*的操作,封装为函数,方便后续工程使用,修改代码如下:
TCHAR* stringToTCHAR(string str)
{
TCHAR wc[200] = { 0 };
char mc[100] = { 0 };
memcpy(mc, str.c_str(), str.length());
MultiByteToWideChar(CP_ACP, 0, mc, -1, wc, 200);
TCHAR* szExeName = wc;
return szExeName;
}
int main()
{
string ProName = "Agent状态监视软件.exe";
TCHAR* szExeName = stringToTCHAR(ProName);
cout << "进程个数:"<< GetProcessCount(szExeName) << endl;
system("pause");
return 0;
}
但是,奇怪的事情发生了。。。。
同样的代码,就封装成了函数,然后,运行结果就差别这么大,运行就出现了下面的结果:
解决方法
经过各种百度尝试失败之后,从内存原理重新梳理代码,发现了问题。**stringToTCHAR()作为一个函数,会在栈上开辟一块空间给wc变量,随着这个函数运行完,开辟的空间也会清空,所以函数中szExeName指向的wc就没啦。**因此,不能这么做,应该在堆上开辟一块持久空间,来存放这个变量。
那么?怎么实现那?在修改后代码如下:
TCHAR* stringToTCHAR(string str)
{
TCHAR wc[200] = {0};
char mc[100] = { 0 };
memcpy(mc, str.c_str(), str.length());
int len = MultiByteToWideChar(CP_ACP, 0, mc, -1, wc, 200);
//TCHAR* szExeName = wc;
TCHAR* szExeName = new TCHAR(200);
_tcscpy(szExeName, wc);
return szExeName;
}
int main()
{
string ProName = "Agent状态监视软件.exe";
TCHAR* szExeName = stringToTCHAR(ProName);
cout << "进程个数:"<< GetProcessCount(szExeName) << endl;
system("pause");
return 0;
}
至此,问题成功解决。
代码仍需修改和完善,这里仅作为例子,说明下这种问题如何分析和解决。