Я новичок в 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 в другую папку ??). Если это должно быть амбициозной или трудной задачей, я, вероятно, должен был бы отпустить ее.