blob: d5b69f7935faeba1e9cbd5279449791f5d29d407 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
// 18 august 2014
#include "winapi_windows.h"
#include "_cgo_export.h"
// this should be reasonable
#define NFILENAME 4096
WCHAR *openFile(void)
{
OPENFILENAMEW ofn;
DWORD err;
WCHAR *filenameBuffer;
// freed on the Go side
filenameBuffer = (WCHAR *) malloc((NFILENAME + 1) * sizeof (WCHAR));
if (filenameBuffer == NULL)
xpanic("memory exhausted in OpenFile()", GetLastError());
filenameBuffer[0] = L'\0'; // required by GetOpenFileName() to indicate no previous filename
ZeroMemory(&ofn, sizeof (OPENFILENAMEW));
ofn.lStructSize = sizeof (OPENFILENAMEW);
ofn.hwndOwner = NULL;
ofn.hInstance = hInstance;
ofn.lpstrFilter = NULL; // no filters
ofn.lpstrFile = filenameBuffer;
ofn.nMaxFile = NFILENAME + 1; // TODO include + 1?
ofn.lpstrInitialDir = NULL; // let system decide
ofn.lpstrTitle = NULL; // let system decide
// TODO OFN_SHAREAWARE?
// TODO remove OFN_NODEREFERENCELINKS? or does no filters ensure that anyway?
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_FORCESHOWHIDDEN | OFN_HIDEREADONLY | OFN_LONGNAMES | OFN_NOCHANGEDIR | OFN_NODEREFERENCELINKS | OFN_NOTESTFILECREATE | OFN_PATHMUSTEXIST;
if (GetOpenFileNameW(&ofn) == FALSE) {
// TODO stringify
err = CommDlgExtendedError();
if (err == 0) // user cancelled
return NULL;
xpanic("error running open file dialog", GetLastError());
}
return filenameBuffer;
}
|