繁体   English   中英

syscall-如何在Go中使用LPWSTR?

[英]syscall - How to use LPWSTR in Go?

我正在尝试为Go创建Windows MMDevice API的瘦包装,并且遇到了有关Windows字符串数据类型的问题。 根据IMMDevice :: GetId方法的文档,它采用以下参数:

HRESULT GetId(
    [out] LPWSTR *ppstrId
);

这是与上述方法相对应的我的Go代码。 github.com/moutend/ywca/immdevice_windows.go:13

func getId(mmd *IMMDevice, strId *uint16) (err error) {
    hr, _, _ := syscall.Syscall(
        mmd.VTable().GetId,
        2,
        uintptr(unsafe.Pointer(mmd)),
        uintptr(unsafe.Pointer(strId)),
        0)
    // ...
}

我的理解是LPWSTR是指向uint16值数组的指针,但它会导致无效的指针错误。 在这种情况下应该使用哪种类型? 谢谢。

它是指向指针的指针。 LPWSTR类型为wchar_t* ,因此该方法中的参数为wchar_t**

您没有传递要用于填充方法的字符串缓冲区。 该方法将使用CoTaskMemAlloc分配内存,并在填满该内存地址后将其返回给您。 您负责使用CoTaskMemAlloc释放此内存。

要做的第一件事是阅读Windows功能的文档。

IMMDevice :: GetId方法

 HRESULT GetId( [out] LPWSTR *ppstrId ); 

参量

ppstrId [输出]

指向指针变量的指针,该方法在其中将包含端点设备ID的以空终止的宽字符字符串的地址写入其中。 该方法为字符串分配存储空间。 调用者负责通过调用CoTaskMemFree函数来释放不再需要的存储。 如果GetId调用失败,则* ppstrId为NULL。 有关CoTaskMemFree的信息,请参阅Windows SDK文档。

返回值

如果该方法成功,则返回S_OK。 如果失败,则可能的返回码包括但不限于下表中显示的值。

特别是,“ppstrId [out]指向一个指针变量......”你有strId *uint16*pstrId时,我希望你有strId **uint16*ppstrId

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM