我不得不承认,这总是让我困惑某些Windows API如何接受字符串。以SetWindowText()为例。现在任何将指针指向任何东西的函数通常意味着它不存储该对象,而只是使用传递的指针。因此,调用者有责任确保传递给它的对象随时存在。现在您期望将在下面打印的最终消息是什么?
TCHAR * label = new TCHAR[50]();
_tcscpy( label, _T("allocated string") );
m_wndStaticLabel.SetWindowText( label );
_tcscpy( label, _T("string has changed") );
从理论上讲,我希望它能打印出来#34;字符串已经改变了#34;但它打印"分配字符串"。类似地:
CString label = _T("CString Label");
m_wndStaticLabel.SetWindowText( label );
在这种情况下,一个局部变量' label`的指针正在传递给它,但仍然没有问题。控件总是打印正确的字符串,即使它收到堆栈上分配的字符串指针。
这意味着控件实际上分配了自己的内存,并将其分配给控件而不是我们传递的指针,但这个事实从未记录过。这有点误导吗?当我传递指向函数的指针时,我立即提醒自己的一件事是我不应该在函数返回之前销毁它,但在这种情况下不是这种情况,也没有记录。
所以我的问题最终只是缺少文档,或者当我们将指针传递给对象时它还有其他东西,但它的行为就像我们按值传递对象一样?
答案 0 :(得分:5)
请记住,Windows API基于C约定。这意味着传递字符串的 only 方式是指向第一个字符的指针。例如,除了隐式转换为CString
之外,所有函数都不接受std::wstring
或const wchar_t *
。
你是否正确担心控件是否保留了指针的副本,但请确保它没有。文档没有提到这一点,默认情况下是假设 - 如果指针 保留,则会有一个关于它的注释。您会发现某些句柄以这种方式记录。
答案 1 :(得分:2)
我认为所有带有指针的Windows API函数只会在运行时使用指针,但绝不会存储它们(除了特殊记录的情况)。稍后需要数据时,会复制一份副本。
问题如果函数存储指针,那么系统取得对象的所有权,因此负责释放>强>他们。但是,函数需要知道如何分配对象 - 有很多可能性。
我通常也会在自己的职能中坚持这个原则。
答案 2 :(得分:0)
在C ++中,当作为函数参数传递时,数组会衰减为指针,因此原型完全应该是 - 指向TCHAR的指针。否则,您如何建议编写SetWindowText()
的函数原型?
此外,请查看您的代码示例。您忽略了_tcscpy()
函数,只关注SetWindowText()。鉴于你的推理,_tcscpy()在给定TCHAR *时应该如何表现?