Created
June 13, 2017 09:02
-
-
Save moutend/9ddfb948459d5e19cd335be85ca39828 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
// +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