如何将LPTSTR传递给函数并修改它的内容

时间:2013-02-10 12:55:32

标签: c++

我需要一个提供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_sStringCchCopy)中添加内容,除非我使用new TCHAR[bufSize]为其分配了一些内存。我已经尝试为它分配一个完全相同大小的初始值,但结果相同,这使我认为内存分配实际上与它无关。然后以某种方式将我的LPTSTR转换为TCHAR []?我不明白这是怎么可能的,但在这个阶段,我会相信任何事情。

有人可以解释一下我做错了什么吗? (或者至少在我理解错误的地方。)一个可能相关的问题是为什么我的std::cout只显示字符串的第一个字符?

2 个答案:

答案 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。