Skip to content

Instantly share code, notes, and snippets.

@moutend
Created June 13, 2017 09:02
Show Gist options
  • Save moutend/9ddfb948459d5e19cd335be85ca39828 to your computer and use it in GitHub Desktop.
Save moutend/9ddfb948459d5e19cd335be85ca39828 to your computer and use it in GitHub Desktop.
// +build windows
package main
import (
"fmt"
"io/ioutil"
"log"
"reflect"
"syscall"
"time"
"unsafe"
"github.com/go-ole/go-ole"
"github.com/moutend/go-wss"
)
var (
modhello, _ = syscall.LoadDLL("D:\\synth.dll")
procGetHello, _ = modhello.FindProc("GetHello")
)
func GetHello(str *byte) (err error) {
var hr uintptr
var size uint64
//var dr *wss.IDataReader
var buf *wss.IBuffer
hr, _, _ = procGetHello.Call(
uintptr(unsafe.Pointer(str)),
uintptr(unsafe.Pointer(&size)),
uintptr(unsafe.Pointer(&buf)))
if hr != 0 {
err = fmt.Errorf("unknown error %v", hr)
return
}
fmt.Println("size", size)
var length uint32
var capacity uint32
if err = buf.GetLength(&length); err != nil {
return
}
fmt.Println("length", length)
if err = buf.GetCapacity(&capacity); err != nil {
return
}
fmt.Println("capacity", capacity)
var unk *ole.IUnknown
if buf.PutQueryInterface(ole.IID_IUnknown, &unk); err != nil {
return
}
fmt.Println("converted to iunknown")
var bba *wss.IBufferByteAccess
if err = unk.PutQueryInterface(wss.IID_IBufferByteAccess, &bba); err != nil {
return
}
fmt.Println("converted to bba")
var bufPtr *byte
if err = bba.Buffer(&bufPtr); err != nil {
return
}
fmt.Println("bufPtr", bufPtr)
rawBufPtr := uintptr(unsafe.Pointer(bufPtr))
fmt.Println(rawBufPtr)
fmt.Println("@@@")
sliceHeader := reflect.SliceHeader{Data: rawBufPtr, Len: int(size), Cap: int(size)}
slice := *(*[]byte)(unsafe.Pointer(&sliceHeader))
fmt.Println(string(slice[0:10]))
if err = ioutil.WriteFile("ayumi.wav", slice, 0644); err != nil {
return
}
fmt.Println("saved as wav file")
return
}
func main() {
var err error
if err = run(); err != nil {
log.Fatal(err)
}
return
}
func run() (err error) {
fmt.Println("foo")
ole.RoInitialize(1)
//defer ole.RoUninitialize()
var str [32]byte
if err = GetHello(&str[0]); err != nil {
return
}
fmt.Println(str)
fmt.Println(string(str[:]))
time.Sleep(3 * time.Second)
return
var ins *ole.IInspectable
className := "Windows.UI.Xaml.Controls.MediaElement"
if ins, err = ole.RoActivateInstance(className); err != nil {
return
}
var me *wss.IMediaElement
if err = ins.PutQueryInterface(wss.IID_IMediaElement, &me); err != nil {
return
}
fmt.Println("done")
return
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment