Вызов функции Go из VBA через DLL - PullRequest
0 голосов
/ 23 декабря 2019

Я новичок в Go и не имею опыта компиляции или C ++. Итак, начиная с нуля, я пытаюсь скомпилировать dll в Go и вызвать функцию в VBA. Я занимаюсь разработкой Go в Linux и переключаю компьютеры, чтобы попробовать его в Windows. Часть VBA может не быть существенной. Это служит для меня способом проверить вызов dll.

Вот простой код Go:

  package main

  import (
      "C"
      "fmt"
  )

  func main() {
      var x int
      x = Test()
      fmt.Println(x)
  }

  func Test() int {
      return 666
  }

Он работает для go build, go install и вызывает main из консоли.

Я компилирую эти две команды, которые обе работают без ошибок, в следующем порядке. Должен ли я запустить их обоих? (Я далеко не в этом разбираюсь.) Целевая система - Windows 10, 64-битная с Office 365 ProPlus (но является ли Excel в основном 32-битной?):

env GOOS=windows GOARCH=386 CGO_ENABLED=1 CC=i686-w64-mingw32-gcc go build -buildmode=c-shared -o hello.dll hello.go

env GOOS=windows GOARCH=amd64 CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc go build -buildmode=c-shared -o hello.dll hello.go

Я копирую файл, hello.dll, в System32 и в VBA я объявляю:

Public Declare Function Test Lib "C:\Windows\System32\hello.dll" () as Long

Я получаю ошибку Run-ошибка времени '53': файл не найден, что, как я понимаю, может быть вызвано отсутствующей зависимостью.

Итак, я запускаю Dependency Walker. Это показывает мне верхний уровень HELLO.DLL и 4 уровня под ним: KERNEL32.DLL, MSVCRT.DLL, WINMM.DLL, WS2_32.DLL. И это дает:

Error: At least  one required implicit or forwarded depende3ncy was not found. 
Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresovled import due to a missing export function in a a delay-load dependent module.

Огромное количество желтых вопросительных знаков. И десятки модулей, открывающих файл с ошибкой, с именами, такими как API-MS-WIN-CORE-... и EXT-MS-WIN-NTUSER-..., а также HVSIFILETRUST.DLL и IESHIMS.DLL и EMCLIENT.DLL

Так что у меня есть несколько движущихся частей в моемколени, и я далеко из моей глубины. Я надеюсь, что я просто пропускаю простой шаг (возможно, поместите dll в другую папку ??). Если это должно быть амбициозной или трудной задачей, я, вероятно, должен был бы отпустить ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...