英文:
Golang: using Windows 10 API / UWP / System.WindowsRuntime?
问题
使用Go中的syscall
,我如何调用Windows 10中的UWP API?我已经看过并尝试了许多_win32_的示例,但当我尝试使用System.WindowsRuntime.dll
时,出现了问题;具体来说,我收到了以下错误信息:
panic: Failed to load System.WindowsRuntime.dll: The specified module could not be found.
(这是在运行时发生的,二进制文件构建正常)
我尝试使用标准的go build
命令构建,以及
go build -ldflags="-H windows"
示例代码:
var(
windowsRuntime = syscall.NewLazyDLL("System.WindowsRuntime.dll")
getDiskFreeSpace = windowsRuntime.NewProc("GetDiskFreeSpace")
)
注意:我还尝试了其他变体:
windowsRuntime = syscall.NewLazyDLL("System.Runtime.WindowsRuntime.dll")
和
windowsRuntime = syscall.NewLazyDLL("WindowsRuntime.dll")
有人能够成功运行这个程序或者对此有任何建议吗?
一如既往,非常感谢!
英文:
Using syscall
in Go how can I call the UWP APIs within Windows 10? I have seen and tried many win32 examples, but when I tried using System.WindowsRuntime.dll
it was a no-go; specifically, I received:
panic: Failed to load System.WindowsRuntime.dll: The specified module could not be found.
(this was at runtime, the binary built fine)
I tried building both with a standard go build
as well as
go build -ldflags="-H windows"
example code:
var(
windowsRuntime = syscall.NewLazyDLL("System.WindowsRuntime.dll")
getDiskFreeSpace = windowsRuntime.NewProc("GetDiskFreeSpace")
)
Note: Other variants tried:
windowsRuntime = syscall.NewLazyDLL("System.Runtime.WindowsRuntime.dll")
&
windowsRuntime = syscall.NewLazyDLL("WindowsRuntime.dll")
Anyone been able to get this running or have any advice on the matter?
As always, greatly appreciated!!
答案1
得分: 2
创建一个如下所示的文件:
//go:generate mkwinsyscall -output zfree.go free.go
//sys getDiskFreeSpace(pathName string, sectorsPerCluster *int, bytesPerSector *int, freeClusters *int, numberOfClusters *int) (err error) = GetDiskFreeSpaceA
package main
func main() {
var bytesPerSector, freeClusters, numberOfClusters, sectorsPerCluster int
getDiskFreeSpace(
`C:\`,
§orsPerCluster,
&bytesPerSector,
&freeClusters,
&numberOfClusters,
)
println("bytesPerSector", bytesPerSector)
println("freeClusters", freeClusters)
println("numberOfClusters", numberOfClusters)
println("sectorsPerCluster", sectorsPerCluster)
}
然后进行构建:
go generate
go mod init free
go mod tidy
go build
结果:
bytesPerSector 512
freeClusters 12511186
numberOfClusters 25434879
sectorsPerCluster 8
https://github.com/golang/sys/tree/master/windows/mkwinsyscall
英文:
Create a file like this:
//go:generate mkwinsyscall -output zfree.go free.go
//sys getDiskFreeSpace(pathName string, sectorsPerCluster *int, bytesPerSector *int, freeClusters *int, numberOfClusters *int) (err error) = GetDiskFreeSpaceA
package main
func main() {
var bytesPerSector, freeClusters, numberOfClusters, sectorsPerCluster int
getDiskFreeSpace(
`C:\`,
&sectorsPerCluster,
&bytesPerSector,
&freeClusters,
&numberOfClusters,
)
println("bytesPerSector", bytesPerSector)
println("freeClusters", freeClusters)
println("numberOfClusters", numberOfClusters)
println("sectorsPerCluster", sectorsPerCluster)
}
Then build:
go generate
go mod init free
go mod tidy
go build
Result:
bytesPerSector 512
freeClusters 12511186
numberOfClusters 25434879
sectorsPerCluster 8
https://github.com/golang/sys/tree/master/windows/mkwinsyscall
答案2
得分: 0
我不知道你在哪里找到了"System.WindowsRuntime.dll",据我所知,它并不存在(除非你手动创建了一个名为这样的DLL)。
至于System.Runtime.WindowsRuntime.dll,它是.NET Framework的一部分,而不是Windows,它是一个托管的DLL。你不能使用syscall.NewLazyDLL加载这样的DLL。而且,该DLL实际上并不包含任何Windows API,只是为了让.NET能够与它们一起工作的粘合剂。
你可能正在寻找combase.dll中的RoGetActivationFactory等函数。
英文:
I have no idea where you found "System.WindowsRuntime.dll" because as far as I can tell, it doesn't exist (unless you manually made a DLL named that).
As for System.Runtime.WindowsRuntime.dll: it's part of .NET Framework, not Windows, and it is a managed DLL. You cannot load such DLLs using syscall.NewLazyDLL. What's more, that DLL doesn't really contain any Windows APIs - just glue for .NET to be able to work with them.
You're probably looking for functions like RoGetActivationFactory in combase.dll.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论