我需要一个提供LPTSTR和枚举值的函数,根据该值构造一个字符串并将其放入LPTSTR。
我编写了以下函数,该函数使用由枚举值索引的名称数组:
bool GetWinClassName(const int &WinType, LPTSTR *className, const int bufSize)
{
bool allOk = true;
LPTSTR tempName = new TCHAR[bufSize];
_stprintf_s(tempName, bufSize, TEXT("Win%sClass"), g_WinNames[WinType]);
std::cout << (char*)tempName << std::endl;
if (FAILED(StringCchCopy(*className, (bufSize+1)*sizeof(TCHAR), tempName)))
{
allOk = false;
}
delete[] tempName;
return allOk;
}
(最初我使用_stprintf_s
而不是className
获得了tempName
行,这已被分解以找出错误的位置。)
以上代码在VC2010 Express中编译,但在尝试执行*className
行时,会给出一个未处理的异常:“访问违规写入”(推测)StringCchCopy
。
我可以通过
来实现这一点className = new TCHAR[bufSize];
在调用函数之前(之后匹配delete[]
)但每次我想调用函数时是否真的需要这样做?
我理解 问题在哪里但不是为什么阻碍了我提出可行解决方案的努力。在我看来,问题是我无法在LPTSTR(通过_stprintf_s
或StringCchCopy
)中添加内容,除非我使用new TCHAR[bufSize]
为其分配了一些内存。我已经尝试为它分配一个完全相同大小的初始值,但结果相同,这使我认为内存分配实际上与它无关。然后以某种方式将我的LPTSTR转换为TCHAR []?我不明白这是怎么可能的,但在这个阶段,我会相信任何事情。
有人可以解释一下我做错了什么吗? (或者至少在我理解错误的地方。)一个可能相关的问题是为什么我的std::cout
只显示字符串的第一个字符?
答案 0 :(得分:1)
wstring winClassName( int const winType )
{
return wstring( L"Win" ) + g_WinNames[winType] + L"Class";
}
但是我完全不知道为什么你有这么全球的名字等等:它可能是一个设计级错误。
答案 1 :(得分:0)
每次我想调用这个函数时,我真的需要这样做吗?
LPTSTR值不是字符串对象,它只是指向TCHAR的指针。如果你没有分配缓冲区,你认为角色会去哪里?您必须确保className
指针参数指向可以写入的内存缓冲区。是否每次都分配一个新的缓冲区取决于您。
正如Alf所暗示的,更好的选择是避免直接使用指针和动态分配的数组,并返回一个字符串对象。
为什么我的std :: cout只显示字符串的第一个字符?
如果定义了UNICODE,请使用std :: wcout。