// Copyright 2010-2012 The W32 Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package w32 import ( "syscall" "unsafe" ) var ( modole32 = syscall.NewLazyDLL("ole32.dll") procCoInitializeEx = modole32.NewProc("CoInitializeEx") procCoInitialize = modole32.NewProc("CoInitialize") procCoUninitialize = modole32.NewProc("CoUninitialize") procCreateStreamOnHGlobal = modole32.NewProc("CreateStreamOnHGlobal") ) func CoInitializeEx(coInit uintptr) HRESULT { ret, _, _ := procCoInitializeEx.Call( 0, coInit) switch uint32(ret) { case E_INVALIDARG: panic("CoInitializeEx failed with E_INVALIDARG") case E_OUTOFMEMORY: panic("CoInitializeEx failed with E_OUTOFMEMORY") case E_UNEXPECTED: panic("CoInitializeEx failed with E_UNEXPECTED") } return HRESULT(ret) } func CoInitialize() { procCoInitialize.Call(0) } func CoUninitialize() { procCoUninitialize.Call() } func CreateStreamOnHGlobal(hGlobal HGLOBAL, fDeleteOnRelease bool) *IStream { stream := new(IStream) ret, _, _ := procCreateStreamOnHGlobal.Call( uintptr(hGlobal), uintptr(BoolToBOOL(fDeleteOnRelease)), uintptr(unsafe.Pointer(&stream))) switch uint32(ret) { case E_INVALIDARG: panic("CreateStreamOnHGlobal failed with E_INVALIDARG") case E_OUTOFMEMORY: panic("CreateStreamOnHGlobal failed with E_OUTOFMEMORY") case E_UNEXPECTED: panic("CreateStreamOnHGlobal failed with E_UNEXPECTED") } return stream }