C/C++ TCHAR* 作为函数返回值的问题

背景

首先代码如下:

#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;
}

至此,问题成功解决。
代码仍需修改和完善,这里仅作为例子,说明下这种问题如何分析和解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值