【问题标题】:syscall - How to use LPWSTR in Go?syscall - 如何在 Go 中使用 LPWSTR?
【发布时间】:2017-02-21 02:32:43
【问题描述】:

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

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

【问题讨论】:

    标签: windows go system-calls


    【解决方案1】:

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

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

    【讨论】:

    • 混淆的原因是我对指针值的误解。感谢您提供有用的答案。
    【解决方案2】:

    首先要做的是阅读 Windows 函数的文档。

    IMMDevice::GetId method,

    HRESULT GetId(
        [out] LPWSTR *ppstrId
    );
    

    参数

    ppstrId [out]

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

    返回值

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

    特别是“ppstrId [out] Pointer to a pointer variable ...”你有strId *uint16*pstrId,而我希望你有strId **uint16*ppstrId

    【讨论】:

      猜你喜欢
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 2020-06-01
      • 1970-01-01
      • 2015-01-05
      • 2013-05-07
      相关资源
      最近更新 更多