Как инициализировать LPBOOL? Win32 Api в родном Kotlin - PullRequest
0 голосов
/ 11 сентября 2018

Как я могу назвать это в Kotlin Native

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

пока false не принимается как LPBOOL? Как инициализировать LPBOOL для использования в нативном интерфейсе Kotlin?

Я получаю следующую ошибку:

логический литерал не соответствует ожидаемому типу

LPBOOL? / * = CPointer * />? * / false,

1 Ответ

0 голосов
/ 14 сентября 2018

Отвечая на вопрос, который уже есть в 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
      )
    }

Это должно быть похоже, если вам нужно связать с библиотекой target-c.

...