【问题标题】:wchar_t NUL in managed/unmanaged C++托管/非托管 C++ 中的 wchar_t NUL
【发布时间】:2011-11-23 19:38:18
【问题描述】:

我需要使用这个(非托管)C++ 库。其中一种方法具有 wchar_t* 作为参数。尝试在 C# 中使用它,但我所有的尝试都导致错误代码“无效参数”。

我为它写了一个托管的 C++ 包装器——同样的问题。现在我比较了我的 C++ 包装器和库附带的本机 C++ 示例中的参数值。我看到的唯一显着区别是我的托管 C++ 中的 NUL 是“0 L''”(Visual Studio watch),而非托管示例中的 NUL 只是“0”。它们都具有相同的值... 0.

这真的是问题吗? (我尝试手动将该字符设置为 '0' 但得到相同的结果)如果是,我该如何解决?

编辑: 图片:http://img6.imageshack.us/img6/5977/comparisonofvalues.png 好的,左侧是我的代码(托管 C++),右侧是示例(非托管 C++)。事实上,右边的工作,左边的不工作(函数拒绝参数)。我认为问题在于第 17 个字符 - NUL。 还有什么想法吗?

【问题讨论】:

  • wchar_t* 是一个以 null 结尾的字符串。除此之外,在您展示一些代码并详细说明非托管库期望传递的内容之前,我无能为力。
  • C++/CLI 没有 NUL 或 NULL,它有 nullptr。您的手表没有多大意义,但看起来像一个空字符串 L""。与空指针不同。您必须在 C# [DllImport] 声明中使用 CharSet.Unicode。
  • sec 如何获得它的价值?
  • sec 只是一个指针,它在初始化时给出。我正在使用它而其他功能没有问题。这是给我带来麻烦的那个(顺便说一句,它是唯一一个带有 'const wchar_t*' 的参数)。
  • 好的,我应该指出我的代码可能没有问题。我使用的模拟器的行为与实际硬件不同。所以,基本上,这是一个糟糕的问题。很抱歉浪费了你们的时间,感谢你们的帮助。

标签: .net c++ wchar-t nul


【解决方案1】:

你的调试器的区别只是外观。您会注意到调试器通常显示两个值:二进制值和匹配的 Unicode 字符。但是您不能为二进制值 0 显示 Unicode 字符。两个调试器处理它的方式略有不同(显示 L'' 与什么都不显示),但内存中的位是相同的。

另一方面,您的 ip 字符串是垃圾。

【讨论】:

  • 应该如此。这是“输出值”之一。函数返回 ip和端口。
【解决方案2】:

您可以检查您的项目属性。有一个编译器选项控制 wchar_t 是否被视为内置类型。将此设置为 NO 将使用 wchar_t 的旧标头定义,并且可能会解决您的问题。

【讨论】:

  • 没有区别。我使用 开头(与示例相同,请注意)。不过,感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多