【问题标题】:Raku NativeCall (LPTSTR) &lpMsgBuf?Raku NativeCall (LPTSTR) &lpMsgBuf?
【发布时间】:2020-01-06 06:47:06
【问题描述】:

乐/Perl6 窗户

在 Raku 的原生呼叫中 https://docs.raku.org/language/nativecall

您在子声明中使用 C 的 (LPTSTR) &lpMsgBuf 做什么?那是指向指针的指针吗?

非常感谢, -T

编辑:为了消除任何误解,我不是在问如何用“C”或“C++”写东西。 Raku 就是 Perl 6 现在的名称。而 NativeCall 是一个 Raku 模块(不是 C),它与系统调用(例如 Kernel32.dll)进行交互。

我的问题是在 Raku / Perl 6 中,我如何在 Raku 子声明行中表示 (LPTSTR) &lpMsgBuf。

如果有帮助,(LPTSTR) &lpMsgBuf 是 C++ 语法,在 Kernel32.dll 的调用中表示为 LPTSTR。

【问题讨论】:

  • 你试过Pointer吗?如果失败,请编辑您的问题以包含minimal reproducible example 以及您尝试过的其他内容的详细信息。如果它看起来有效,请分享这个明显成功的细节以及你为什么不接受它。如果您还没有尝试过Pointer,请尝试一下。如果您不想尝试,请说明您不尝试的原因。 TIA。
  • (LPTSTR) &lpMsgBuf 不是内置在 C 中的东西。它是某些人编写的 C 代码,大概是 Microsoft。我从您之前提出的问题中认出了LPTSTR。如果你还不知道它的定义,请查明。如果您知道,请编辑您的问题以包含其定义,以便读者也知道。
  • 我不认为 Raku 或 NativeCall 是 C 模块,也不认为您在询问 C。您误解了我的 cmets。您还没有解释LPTSTR 是什么。 (大概是一个指向 C 字符串的指针,但您需要指定。)您没有解释您尝试过的内容以及它是如何进行的,也没有解释您通过研究发现了什么。作为提出 SO 问题的文化契约的一部分,这是您的责任的一部分。您还没有解释诸如所涉及的 C 函数和 Raku 函数将如何处理 lpMsgBuf 之类的事情。这是确定正确的参数规范所必需的。
  • “如果有帮助,(LPTSTR) &lpMsgBuf 是 C++ 语法”。它是 C 语法(C++ 开始时主要是 C 的超集)。它指定an explicit type conversion。 “LPTSTR 在 Kernel32.dll 的调用中。”感谢您的尝试。我自己的尝试是"LPTSTR is a pointer to a (non-const) TCHAR string"。
  • 嗨 Raiph,我想我正在与其他已经知道我在说什么的程序员通信。 LPTSTR 是一个指向“C”TCHAR 字符串的长指针。在 32 位和 64 位系统上,“L”并非没有意义。 A TCHAR 是 CHAR 是你没有使用 unicode -T

标签: raku


【解决方案1】:

想通了。它是“CArray[byte] 是 rw”

【讨论】:

  • 对于其他阅读者,请注意 C 参数 (LPTSTR) &foo 不一定映射到 CArray[BYTE] is rw 作为 NativeCall 等效项。我的猜测是,当 dwFlags 没有 FORMAT_MESSAGE_ALLOCATE_BUFFER ORed 时,Todd 正在专门谈论对 FormatMessage 函数调用的变体之一的调用。这样的函数调用不会在 C 语言中分配,假设它传递了一个已经分配的缓冲区(在这种情况下由 Raku 分配),并写入该缓冲区。
  • 如果它只是一个“指向 Str 的长指针”,那么 sub CSub (Str $param) 也应该可以工作,假设它的 null 终止,并且指针被 C 释放(而不是释放)。如果指针 是 C 分配的和 C 处置,那么推荐使用CArray[uint8]。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 2012-05-20
相关资源
最近更新 更多