【问题标题】:How to initialize LPBOOL? Win32 Api in Kotlin Native如何初始化 LPBOOL? Kotlin Native 中的 Win32 Api
【发布时间】:2018-09-11 17:49:13
【问题描述】:

如何在 Kotlin Native 中调用它

    val result = CopyFileExA(
                          oldFile,
                          newFile,
                          null,
                          null,
                          false,
                          COPY_FILE_FAIL_IF_EXISTS
                         )

false 不被接受为LPBOOL?如何初始化 LPBOOL 以在 Kotlin 本机界面中使用?

我收到以下错误:

布尔文字不符合预期的类型

LPBOOL? /* = C指针 */>? */ 假的,

【问题讨论】:

  • LPBOOL 是指向 BOOL 变量 (BOOL*) 的指针。我不知道 Kotlin 是什么,但在 C/C++ 中,这个调用会像这样:BOOL cancel = FALSE; BOOL result = CopyFileExA(oldFile, newFile, NULL, NULL, &cancel, COPY_FILE_FAIL_IF_EXISTS);

标签: winapi kotlin compiler-errors native kotlin-native


【解决方案1】:

回答github from @olonho中已有的问题

您需要使用特殊的平台类型NativePlacement 分配一个变量

import kotlinx.cinterop.*
import platform.windows.*

val buffer = nativeHeap.allocArray<ByteVar>(size)
<use buffer>
nativeHeap.free(buffer)

但为了避免免费调用或未分配的内存,您可以使用 memScoped

val fileSize = memScoped {
  val statBuf = alloc<statStruct>()
  val error = stat("/", statBuf.ptr)
  statBuf.st_size
}

重要的是,指针绑定将与 statBuf.ptr,那么您的代码将是:

    memScoped {
      val oldFile = "README.md"
      val newFile = "${oldFile}.cp"
      val bool = alloc<BOOLVar>()
      bool.value = FALSE

      val result = CopyFileExA(
              oldFile,
              newFile,
              null,
              null,
              bool.ptr,
              COPY_FILE_FAIL_IF_EXISTS
      )
    }

如果你需要绑定一个objective-c库,这必须是相似的。

【讨论】:

    猜你喜欢
    • 2022-12-19
    • 2010-09-12
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 2015-09-30
    • 2021-07-02
    相关资源
    最近更新 更多