Winapi 如何从golang中的windows`syscall`加载图像资源?

Winapi 如何从golang中的windows`syscall`加载图像资源?,winapi,go,Winapi,Go,我正在编写一个golang程序,用于嵌入图像资源,并使用资产(字符串)([]字节,错误)函数访问资源。但我现有的库代码如下所示: func NewIconFromFile(filePath string) (uintptr, error) { absFilePath, err := filepath.Abs(filePath) if err != nil { return 0, err } hicon, _, _ := LoadImage.Call

我正在编写一个golang程序,用于嵌入图像资源,并使用
资产(字符串)([]字节,错误)
函数访问资源。但我现有的库代码如下所示:

func NewIconFromFile(filePath string) (uintptr, error) {
    absFilePath, err := filepath.Abs(filePath)
    if err != nil {
        return 0, err
    }
    hicon, _, _ := LoadImage.Call(
        0,
        uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(absFilePath))),
        IMAGE_ICON,
        0,
        0,
        LR_DEFAULTSIZE|LR_LOADFROMFILE)
    if hicon == 0 {
        return 0, errors.New("load image failed: " + filePath)
    }
    return hicon, nil
}
如何将此函数重写为:

 func NewIconFromRawBytes(imgBytes []byte) (uintptr, error) 
因此,它可以支持从
[]字节加载图像?有什么帮助吗?谢谢

编辑:有,如何将其移植到golang。

LoadImage()
处理直接内置到Windows可执行文件中的Windows资源
go bindata
似乎无法处理这些问题,而直接使用go来完成这项工作并不是一件小事

如果您希望能够编写一个
NewIconFromRawBytes()
从内存创建
HICON
,则需要使用名称混乱的函数。如果你这样做,你可能要记住

但是,如果这是一个图像而不是一个图标,并且您希望从中得到一个
HBITMAP
,那么您需要做更多的工作,包括函数。需要注意的是,
CreateDIBSection()
为您分配图像内存,因此您必须将其从Go复制到提供的内存位置


旁注:如果您有一个
*image.RGBA
*image.NRGBA
,如果您想将其放入
HBITMAP
,则需要翻转字节,因为Windows希望字节按
BGRA
顺序,而不是
RGBA
顺序。

为什么返回
uintpttr
?什么是
LoadImage
?代码中似乎有很多假设没有得到充分解释以提供答案。@apxp:这不是警告的意思,任何时候看到“不安全”都盲目重复是没有用的。Go中的许多东西都需要
unsafe
软件包,例如使用
sys
/
syscall
软件包,并且在将来的版本中完全支持正确使用。该警告意味着可能会以依赖内部实现或特定于平台的详细信息的方式使用不安全,而不仅仅是简单地导入它会使您的程序不兼容。@Flimzy原始代码可以在github repo上找到:。@Flimzy此代码严格处理Windows API;如果您知道在围棋中使用它意味着什么,那么就没有任何假设。