41 lines
1.3 KiB
C
41 lines
1.3 KiB
C
|
// 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;
|
||
|
}
|