Created
July 15, 2014 11:26
-
-
Save stefanschneider/ea883d74fa0ad73092fc to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// .net-sysversion project main.go | |
package main | |
// // importing C will increase the stack size. this is useful | |
// // if loading a .NET COM object, beacuse the CLR requires a larger stack | |
// #cgo LDFLAGS: -loleaut32 | |
// #include "windows.h" | |
// #include "OleAuto.h" | |
import "C" | |
import ( | |
"fmt" | |
"github.com/mattn/go-ole" | |
"github.com/mattn/go-ole/oleutil" | |
"log" | |
"runtime" | |
"unsafe" | |
) | |
func leakyFunc() { | |
errr := ole.CoInitializeEx(0, ole.COINIT_MULTITHREADED) // can interact in a bad way with go threads | |
if errr != nil { | |
log.Fatal(errr) | |
} | |
defer ole.CoUninitialize() | |
unknown, errr := oleutil.CreateObject("System.Version") | |
if errr != nil { | |
log.Fatal(errr) | |
} | |
defer unknown.Release() | |
sysver, errr := unknown.QueryInterface(ole.IID_IDispatch) | |
if errr != nil { | |
log.Fatal(errr) | |
} | |
defer sysver.Release() | |
res, errr := oleutil.CallMethod(sysver, "ToString") | |
fmt.Println(res.ToString()) | |
for { | |
oleutil.CallMethod(sysver, "ToString") | |
} | |
} | |
func nonleakyFunc() { | |
errr := ole.CoInitializeEx(0, ole.COINIT_MULTITHREADED) // can interact in a bad way with go threads | |
if errr != nil { | |
log.Fatal(errr) | |
} | |
defer ole.CoUninitialize() | |
unknown, errr := oleutil.CreateObject("System.Version") | |
if errr != nil { | |
log.Fatal(errr) | |
} | |
defer unknown.Release() | |
sysver, errr := unknown.QueryInterface(ole.IID_IDispatch) | |
if errr != nil { | |
log.Fatal(errr) | |
} | |
defer sysver.Release() | |
res, errr := oleutil.CallMethod(sysver, "ToString") | |
fmt.Println(res.ToString()) | |
for { | |
res, err := oleutil.CallMethod(sysver, "ToString") | |
if err == nil { | |
runtime.SetFinalizer(res, func(f *ole.VARIANT) { | |
C.VariantClear((*C.struct_tagVARIANT)(unsafe.Pointer(f))) | |
}) | |
} | |
} | |
} | |
func main() { | |
//leakyFunc() | |
nonleakyFunc() | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment