Windigo provides full support for Component Object Model (COM) objects.
Lifetime Management:
Because COM objects require manual reference counting, Windigo uses a win.OleReleaser object to manage their lifetimes. A win.OleReleaser acts like an arena allocator: you pass it to functions that produce COM objects, and calling releaser.Release() will call Release on all associated COM objects at once. This ensures proper cleanup and prevents memory leaks.
Initialization:
Before using COM, you must initialize the COM library using win.CoInitializeEx (typically with co.COINIT_APARTMENTTHREADED) and ensure you call win.CoUninitialize when finished.
Example: Using a COM File Open Dialog:
package main
import (
"github.com/rodrigocfd/windigo/co"
"github.com/rodrigocfd/windigo/win"
)
func main() {
runtime.LockOSThread()
_, _ = win.CoInitializeEx(
co.COINIT_APARTMENTTHREADED | co.COINIT_DISABLE_OLE1DDE)
defer win.CoUninitialize()
releaser := win.NewOleReleaser()
defer releaser.Release()
var fod *win.IFileOpenDialog
_ = win.CoCreateInstance(
releaser,
&co.CLSID_FileOpenDialog,
nil,
co.CLSCTX_INPROC_SERVER,
&fod,
)
defOpts, _ := fod.GetOptions()
_ = fod.SetOptions(defOpts |
co.FOS_FORCEFILESYSTEM |
co.FOS_FILEMUSTEXIST,
)
_ = fod.SetFileTypes([]win.COMDLG_FILTERSPEC{
{Name: "Text files", Spec: "*.txt"},
{Name: "All files", Spec: "*.*"},
})
_ = fod.SetFileTypeIndex(1)
if ok, _ := fod.Show(win.HWND(0)); ok {
item, _ := fod.GetResult(releaser)
fileName, _ := item.GetDisplayName(co.SIGDN_FILESYSPATH)
println(fileName)
}
}