第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

COM 中的 UTF-16 字符串

COM 中的 UTF-16 字符串

Go
至尊寶的傳說 2022-05-18 10:38:38
請有人解釋一下我嘗試調(diào)用 COM 函數(shù)的 Go 指針魔法func (p *IServer) Authorize(user, pass string) error {  UserName := ole.SysAllocString(login.UserName)  defer ole.SysFreeString(UserName)  UserPsw := ole.SysAllocString(login.UserPsw)  defer ole.SysFreeString(UserPsw)    // HRESULT IServer::Authorize([in] BSTR UserName, [in] BSTR UserPsw, [out] VARIANT* SID, [out, retval] long* Result)  hr, _, _ := Call(p.VTable().Authorize,    uintptr(unsafe.Pointer(p)),    uintptr(unsafe.Pointer(UserName)),    uintptr(unsafe.Pointer(UserPsw)),    uintptr(unsafe.Pointer(sid)),    uintptr(unsafe.Pointer(&res)))   ...}此代碼運行良好,但是當我將轉(zhuǎn)換替換為UserName := syscall.StringToUTF16Ptr(login.UserName)UserPsw := syscall.StringToUTF16Ptr(login.UserPsw)它會導致訪問違規(guī)!來自 go-olefunc SysAllocString(v string) (ss *int16) {  pss, _, _ := procSysAllocString.Call(uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(v))))  ss = (*int16)(unsafe.Pointer(pss))  return}我究竟做錯了什么?更新:在 C/C++ 中 wchar* 指針在 386/amd64 中都可以正常工作void Authorize(IServer* p wchar* user, wchar* pass) {   p.Authorize(user, pass ....}
查看完整描述

1 回答

?
函數(shù)式編程

TA貢獻1807條經(jīng)驗 獲得超9個贊

SysAllocString 返回 BSTR 類型,com 類型對象。


 typedef struct {

 #ifdef _WIN64

     DWORD pad;

 #endif

     DWORD size;

     union {

         char ptr[1];

         WCHAR str[1];

         DWORD dwptr[1];

     } u; // take it as a starting point of the string 

 } bstr_t;

換句話說,它是相同的 utf16 編碼字符串,但前綴是其大?。║nicode 字符的長度乘以 wchar_t 的大?。?-4 字節(jié)))。出于優(yōu)化的原因,它也有填充。


由于它的浮動大小,最好使用 ole 包而不是重新發(fā)明輪子。如果你想自己實現(xiàn)它,并且 wchar_t 的大小為 int16(2 字節(jié)),那么你必須執(zhí)行以下操作:


(半偽代碼,我沒測試過)


type BSTR *uint16


func SysAllocString(str string) (result BSTR) {

    // DWORD == int32 == rune

    const padf = "\x00" // only for 64 bit system

    const sizef = "\x00"


    // int32 == 4 byte 

    // int16 == 2 byte

    const wordSize = unsafe.Sizeof(int16(0))


    utf16 := utf16.Encode([]rune(padf + sizef + str))


    /* pad is on index 0 and 1 */

    size :=  &utf16[2 /* 0 for 32 bit system */]


    // set "size" field as unicode charachers length multypled by size of wchar_t

    *(*rune)(unsafe.Pointer(size)) = rune((len(utf16)-2) * int(wordSize))



    result = BSTR(&utf16[0])


    return

}


// ...

bstr := SysAllocString(login.UserName)


uintptr(unsafe.Pointer(bstr))


查看完整回答
反對 回復 2022-05-18
  • 1 回答
  • 0 關注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號