{"record":{"id":"b08ddb60375a4aab","repo":"wailsapp/wails","slug":"invoke-getidsofname-error","errorCode":null,"errorMessage":"Invoke GetIDsOfName error.","messagePattern":"Invoke GetIDsOfName error\\.","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"v3/pkg/w32/utils.go","lineNumber":120,"sourceCode":"\t}\n\treturn disp\n}\n\nfunc ComGetIDsOfName(disp *IDispatch, names []string) []int32 {\n\twnames := make([]*uint16, len(names))\n\tdispid := make([]int32, len(names))\n\tfor i := 0; i < len(names); i++ {\n\t\twnames[i] = syscall.StringToUTF16Ptr(names[i])\n\t}\n\thr, _, _ := syscall.SyscallN(disp.lpVtbl.pGetIDsOfNames,\n\t\tuintptr(unsafe.Pointer(disp)),\n\t\tuintptr(unsafe.Pointer(IID_NULL)),\n\t\tuintptr(unsafe.Pointer(&wnames[0])),\n\t\tuintptr(len(names)),\n\t\tuintptr(GetUserDefaultLCID()),\n\t\tuintptr(unsafe.Pointer(&dispid[0])))\n\tif hr != 0 {\n\t\tpanic(\"Invoke GetIDsOfName error.\")\n\t}\n\treturn dispid\n}\n\nfunc ComInvoke(disp *IDispatch, dispid int32, dispatch int16, params ...interface{}) (result *VARIANT) {\n\tvar dispparams DISPPARAMS\n\n\tif dispatch&DISPATCH_PROPERTYPUT != 0 {\n\t\tdispnames := [1]int32{DISPID_PROPERTYPUT}\n\t\tdispparams.RgdispidNamedArgs = uintptr(unsafe.Pointer(&dispnames[0]))\n\t\tdispparams.CNamedArgs = 1\n\t}\n\tvar vargs []VARIANT\n\tif len(params) > 0 {\n\t\tvargs = make([]VARIANT, len(params))\n\t\tfor i, v := range params {\n\t\t\t//n := len(params)-i-1\n\t\t\tn := len(params) - i - 1","sourceCodeStart":102,"sourceCodeEnd":138,"githubUrl":"https://github.com/wailsapp/wails/blob/0e754b1b40ba9044c2a1460e23b7c3de20fc5cf3/v3/pkg/w32/utils.go#L102-L138","documentation":"ComGetIDsOfName invokes IDispatch::GetIDsOfNames and panics when the HRESULT is non-zero. This call maps method/property names to DISPIDs; failure usually means DISP_E_UNKNOWNNAME (the object has no member with that name) or a malformed/nil IDispatch pointer. The wrapper discards the per-name DISPIDs array that would normally reveal which name failed.","triggerScenarios":"Calling ComInvoke/ComGetIDsOfName with a misspelled member name (case-sensitive against the object's typeinfo); names localized on a different locale; disp being nil or from a released object; passing more names than the object supports resolving at once.","commonSituations":"Scripting COM automation (Office, WScript.Shell, shell objects) from Go where the method name changed between object versions or was guessed; typos in property names; calling late-bound members on objects that only expose a restricted dispatch interface.","solutions":["Verify the member name spelling and case against the object's type library / documentation (e.g. check in VBScript or PowerShell first)","Confirm disp is a live IDispatch obtained from a successful CreateInstance/QueryInterface","Resolve names one at a time to identify exactly which name fails","Recover and report the failed names instead of crashing"],"exampleFix":"// before\nids := w32.ComGetIDsOfName(disp, []string{\"Value\", \"TypoedName\"}) // panics\n\n// after\nfor _, name := range names {\n    id, err := func(n string) (int32, error) {\n        defer func() { _ = recover() }()\n        return w32.ComGetIDsOfName(disp, []string{n})[0], nil\n    }(name)\n    if err != nil { return fmt.Errorf(\"unknown member %q\", name) }\n    _ = id\n}","handlingStrategy":"validation","validationCode":"if disp == nil || disp.LpVtbl == nil {\n    return nil, errors.New(\"ComGetIDsOfName: nil IDispatch\")\n}\nfor _, n := range names {\n    if n == \"\" { return nil, errors.New(\"empty member name\") }\n}","typeGuard":null,"tryCatchPattern":"defer func() {\n    if r := recover(); r != nil {\n        err = fmt.Errorf(\"GetIDsOfNames failed for %v (check spelling/case): %v\", names, r)\n    }\n}()","preventionTips":["Match member names exactly (case-sensitive) against the type library","Resolve one name at a time to isolate failures","Test member names from PowerShell/VBScript first when automating Office-style COM objects"],"tags":["windows","com","idispatch","late-binding","panic"],"backgroundTag":null,"analyzedSha":"0e754b1b40ba9044c2a1460e23b7c3de20fc5cf3","analyzedAt":"2026-08-15T14:17:36.034Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}