系统调用 - 如何在Go中使用LPWSTR?

时间:2017-02-21 02:32:44

标签: windows go system-calls

我正在尝试为Go创建一个Windows MMDevice API的瘦包装器,我遇到了有关字符串的Windows数据类型的问题。 根据{{​​3}}的文档,它采用以下参数:

HRESULT GetId(
    [out] LPWSTR *ppstrId
);

这是我的Go代码,对应于上面的方法。 (IMMDevice::GetId method

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值数组的指针,但它会导致无效的指针错误。 在这种情况下我应该使用什么类型?感谢。

1 个答案:

答案 0 :(得分:0)

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

  

IMMDevice::GetId method

HRESULT GetId(
    [out] LPWSTR *ppstrId
);
     

参数

     

ppstrId [out]

     

指向该方法写入地址的指针变量的指针   包含端点的以null结尾的宽字符串的示例   设备编号。该方法为字符串分配存储空间。呼叫者,召集者   当不再需要时,负责释放存储空间   通过调用CoTaskMemFree函数。如果GetId调用失败,   * ppstrId为NULL。有关CoTaskMemFree的信息,请参阅Windows SDK文档。

     

返回值

     

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

特别是,“ppstrId [out]指向指针变量的指针......”当我希望你有strId *uint16或{{1}时,你有*pstrIdstrId **uint16 }。