Skip to content

Instantly share code, notes, and snippets.

@stefanschneider
Created July 15, 2014 11:26
Show Gist options
  • Save stefanschneider/ea883d74fa0ad73092fc to your computer and use it in GitHub Desktop.
Save stefanschneider/ea883d74fa0ad73092fc to your computer and use it in GitHub Desktop.
// .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