我需要一个提供LPTSTR和枚举值的函数,根据该值构造一个字符串并将其放入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;
}
(本来我只是用className
代替tempName
的_stprintf_s
线,这已被拆散到)
上述代码在VC2010 Express中编译,但给出未处理的异常:“访问冲突写入”到(假定)*className
当它试图执行StringCchCopy
行时。
我能得到这个做
className = new TCHAR[bufSize];
工作调用函数(后一个匹配delete[]
)之前,但我真的需要做的,我想每次调用该函数?
我明白其中问题所在,但不为什么这是阻碍我的努力,拿出一个可行的解决方案。这个问题在我看来是因为我不能通过new TCHAR[bufSize]
为LPTSTR分配一些内存(通过_stprintf_s
或StringCchCopy
)。我试着给它分配一个完全相同大小的初始值,但结果相同,这导致我认为内存分配实际上与它无关。然后它以某种方式将我的LPTSTR转换为TCHAR []?我不认为这是可能的,但在现阶段,我相信任何事情。
有人能解释我在做什么错吗? (或者至少在我的理解错误的地方)。一个可能相关的问题是为什么我的std::cout
只显示字符串的第一个字符?
“我需要一个提供LPTSTR的函数”,jeez,您*需要*支持Windows 9x?如果我可能会问,为什么你需要这个?顺便说一下,你做错了什么:(1)支持Windows 9x *可能*错误,除非你真的需要它(如果你这样做,那么请解释为什么),(2)使用C编程时使用C++ – 2013-02-10 12:56:25
事实上,你需要一个强制让代码“工作”应该是一个明确的赠品'cout'线有什么问题。您要求编译器将某些不指向C风格字符串的内容视为如此。 (你指出它打印错误的字符数量?想一想 - 你是如何期待它知道要打印多少?) – 2013-02-10 13:00:49