如何初始化LPBOOL?Kotlin Native 中的 Win32 API



如何在 Kotlin Native 中称呼它

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

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

我收到以下错误:

布尔文本不符合预期类型

LPBOOL?/* = CPointer */>?*/假

回答 github 中已有的问题 @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 库绑定,这必须是类似的。

最新更新