gpt4 book ai didi

c++ - 为什么 wchar_t* 的第一个字符在传递给 WinRT 组件时被删除?

转载 作者:行者123 更新时间:2023-11-28 03:15:21 24 4
gpt4 key购买 nike

我在 WinRT 组件中有一个 ref 类:

namespace WinRTComponent
{
public ref class Class1 sealed
{
public:
Class1();

void MyMethod(wchar_t* wcharPtr)
{
// Do nothing.
}
};
}

我还有一个 Windows Store C++ XAML 应用程序,它引用了 WinRT 组件。在我的应用程序中,我运行以下代码:

std::wstring str = L"Some text.";
const wchar_t* strPtr = str.data();

WinRTComponent::Class1^ class1 = ref new WinRTComponent::Class1();

wchar_t firstCharBefore = strPtr[0]; // It is 'S', correctly.

class1->MyMethod(const_cast<wchar_t*>(strPtr));

wchar_t firstCharAfter = strPtr[0]; // It is 0! Why?

当我将我的 wchar_t* 指针传递给 WinRT 组件的公共(public)方法时,字符串的第一个字符被删除并更改为 0。

这是什么原因?这是预期的行为还是错误?

最佳答案

我认为这是因为 ref class 上的公共(public)方法 void MyMethod(wchar_t* wcharPtr) 不是一个接受输入字符串的函数,它是一个具有 wchar_t out 参数的函数。换句话说,对于 WinRT MyMethod 是一个返回 16 位字符的函数。所以我的猜测是 WinRT ABI 机制要么在将值提供给 MyMethod 之前将其清空,要么检测到您对 MyMethod 的实现从未分配给它并生成代码为它分配一个默认值。

要点在于,ref 类 的公共(public)方法上的指针参数意味着输出,而不是指针输入。指针不能跨越 ABI 边界,只有 WinRT 类型可以。 C++ 类型 wchar_t 映射到 WinRT 16 位字符类型,所以没关系,指针参数是 C++/CX 实现 WinRT 输出参数的方式,因为这是 C++ 返回数据的最自然方式参数。

要在 C++/CX 中编写接受字符串输入值的组件的公共(public)方法,您必须使用 Platform::String^ 作为参数类型。如果您从 C++/CX 调用此函数,则可以通过传递 StringReference 来避免制作拷贝:

WinRTComponent::Class1^ class1 = ref new WinRTComponent::Class1();
class1->MyMethod(Platform::StringReference(strPtr));

如果这样做,您应该会发现在 MyMethod 内的 String^ 上调用 Data() 会得到相同的 您传入的 strPtr

参见 C++/CX strings documentation 的“StringReference”部分有关它的更多信息。

关于c++ - 为什么 wchar_t* 的第一个字符在传递给 WinRT 组件时被删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17085175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com