2013-02-10 57 views
0

我需要一个提供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_sStringCchCopy)。我试着给它分配一个完全相同大小的初始值,但结果相同,这导致我认为内存分配实际上与它无关。然后它以某种方式将我的LPTSTR转换为TCHAR []?我不认为这是可能的,但在现阶段,我相信任何事情。

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

+0

“我需要一个提供LPTSTR的函数”,jeez,您*需要*支持Windows 9x?如果我可能会问,为什么你需要这个?顺便说一下,你做错了什么:(1)支持Windows 9x *可能*错误,除非你真的需要它(如果你这样做,那么请解释为什么),(2)使用C编程时使用C++ – 2013-02-10 12:56:25

+0

事实上,你需要一个强制让代码“工作”应该是一个明确的赠品'cout'线有什么问题。您要求编译器将某些不指向C风格字符串的内容视为如此。 (你指出它打印错误的字符数量?想一想 - 你是如何期待它知道要打印多少?) – 2013-02-10 13:00:49

回答

1
wstring winClassName(int const winType) 
{ 
    return wstring(L"Win") + g_WinNames[winType] + L"Class"; 
} 

但我只是完全困惑,为什么你有这样的全球数组名称等:它可能是一个设计级别的错误。

0

我真的需要这样做吗?每次我想调用函数吗?

LPTSTR值不是一个字符串对象,它只是一个指向TCHAR的指针。如果你不分配缓冲区,你认为角色会去哪里?您必须确保className指针参数指向您可以写入的内存缓冲区。无论你每次分配一个新缓冲区取决于你。

正如Alf所暗示的,更好的选择是避免直接使用指针和动态分配的数组,并返回一个字符串对象。

为什么我的std :: cout只显示字符串的第一个字符?

如果定义了UNICODE,请改用std :: wcout。