I have been working on wrapping WindowsPortableDevice Api for Golang. The c++ code below was working but suddenly is not working.
libgowpd.h:
#include <Windows.h>
typedef struct IPortableDeviceManager IPortableDeviceManager;
HRESULT createPortableDeviceManager(IPortableDeviceManager **pPortableDeviceManager);
libgowpd.cpp:
#include <libgowpd.h>
HRESULT createPortableDeviceManager(IPortableDeviceManager **pPortableDeviceManager) {
    HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
    if (SUCCEEDED(hr)) {
        hr = CoCreateInstance(CLSID_PortableDeviceManager,
            NULL,
            CLSCTX_INPROC_SERVER,
            IID_PPV_ARGS(pPortableDeviceManager));
    }
    return hr;
}
In Golang
/*
#cgo CFLAGS: -blahblah
#cgo LDFLAGS: -llibgowpd -Ole32
include "libgowpd.h"
*/
import "C"
type HRESULT uint64
type IPortableDeviceManager C.IPortableDeviceManager
func CreatePortableDeviceManager() (*IPortableDeviceManager, error) {
    var pPortableDeviceManager *C.struct_IPortableDeviceManager// No matter whether C.IPortableDeviceManager or C.struct_IPortableDeviceManager
    hr := C.createPortableDeviceManager(&pPortableDeviceManager)
    if hr < 0 {
        return nil, HRESULT(hr)
    }
    if pPortableDeviceManager == nil {
        return nil, E_POINTER
    }
    log.Println("CreatePortableDeviceManager(): Create portable device manager instance.")
    return (*IPortableDeviceManager)(pPortableDeviceManager), nil
}
I think I pass pointer to pPortableDeviceManager correctly via getting address of pPortableDeviceManager but it returns 0x80070057 error code(E_INVALIDARG).
What have I done wrong?
User contributions licensed under CC BY-SA 3.0