加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – Windows API如何接受字符串

发布时间:2020-12-16 09:52:06 所属栏目:百科 来源:网络整理
导读:我必须承认,这总是让我困惑某些 Windows API如何接受字符串.以 SetWindowText()为例.现在任何获取指针的函数通常意味着它不存储该对象,而只是使用传递的指针.因此,调用者有责任确保传递给它的对象随时存在.那么您期望下面将打印出的最终消息是什么? TCHAR *
我必须承认,这总是让我困惑某些 Windows API如何接受字符串.以 SetWindowText()为例.现在任何获取指针的函数通常意味着它不存储该对象,而只是使用传递的指针.因此,调用者有责任确保传递给它的对象随时存在.那么您期望下面将打印出的最终消息是什么?

TCHAR * label = new TCHAR[50]();
_tcscpy( label,_T("allocated string") );
m_wndStaticLabel.SetWindowText( label );
_tcscpy( label,_T("string has changed") );

理论上我希望它打印“字符串已更改”但它打印“已分配的字符串”.同理:

CString label = _T("CString Label");
m_wndStaticLabel.SetWindowText( label );

在这种情况下,一个局部变量’label`的指针正在传递给它,但仍然没有问题.控件总是打印正确的字符串,即使它收到堆栈上分配的字符串指针.

这意味着控件实际上分配了自己的内存,并将其分配给控件而不是我们传递的指针,但这一事实从未记录过.这有点误导吗?当我传递指向函数的指针时,我立即提醒自己的一件事是我不应该在函数返回之前销毁它,但在这种情况下不是这种情况,也没有记录.

所以我的问题最终只是缺少文档,或者当我们将指针传递给一个对象时它还有其他东西,但它的行为就像我们按值传递对象一样?

解决方法

请记住,Windows API基于C约定.这意味着传递字符串的唯一方法是作为指向第一个字符的指针.例如,除了通过隐式转换为const wchar_t *之外,所有函数都不接受CString或std :: wstring.

你是否正确担心控件是否保留了指针的副本,但请确保它没有.文档没有提到这一点,默认情况下是假设 – 如果指针被保留,会有一个关于它的注释.您会发现某些句柄以这种方式记录.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读