2017-02-21 54 views
-1

我正在嘗試爲Go的Windows MMDevice API創建一個薄包裝,並且我遇到了有關Windows數據類型字符串的問題。 據IMMDevice::GetId method的文檔,需要以下參數:syscall - 如何在Go中使用LPWSTR?

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值的陣列,但它會導致無效的指針誤差。 在這種情況下我應該使用什麼類型?謝謝。

回答

0

這是一個指向指針的指針。 LPWSTR類型是wchar_t*,因此該方法中的參數是wchar_t**

您沒有傳入要填寫的方法的字符串緩衝區。該方法將使用CoTaskMemAlloc分配內存,並在填充後將此內存地址返回給您。您有責任使用CoTaskMemAlloc釋放此內存。

+0

混亂的原因是我對指針值的誤解。謝謝你的回答。 – moutend

0

要做的第一件事是閱讀Windows函數的文檔。

IMMDevice::GetId method

HRESULT GetId(
    [out] LPWSTR *ppstrId 
); 

參數

ppstrId [OUT]

指針的指針變量到其中的方法寫入一個空值終止,寬字符的地址 包含端點 設備ID的字符串。該方法爲字符串分配存儲空間。調用者 負責通過調用CoTaskMemFree函數釋放不再需要的存儲空間, 。如果GetId調用失敗,則 * ppstrId爲NULL。有關CoTaskMemFree的信息,請參閱Windows SDK文檔。

返回值

如果方法成功,則返回S_OK。如果失敗,可能返回 代碼包括但不限於 下表中顯示的值。

特別是「ppstrId [out]指向一個指針變量......」你有strId *uint16*pstrId時,我希望你有strId **uint16*ppstrId

相關問題