[英]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功能的文档。
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.