[DllImport("comdlg32.dll", SetLastError=true, CharSet = CharSet.Auto)]
static extern bool GetOpenFileName([In, Out] OpenFileName ofn);
<DllImport("comdlg32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function GetOpenFileName(<[In], Out> ByVal ofn As OpenFileName) As Boolean
End Function
None.
Please add some!
' Copyright
' Microsoft Corporation
' All rights reserved
'typedef struct tagOFN {
' DWORD lStructSize;
' HWND hwndOwner;
' HINSTANCE hInstance;
' LPCTSTR lpstrFilter;
' LPTSTR lpstrCustomFilter;
' DWORD nMaxCustFilter;
' DWORD nFilterIndex;
' LPTSTR lpstrFile;
' DWORD nMaxFile;
' LPTSTR lpstrFileTitle;
' DWORD nMaxFileTitle;
' LPCTSTR lpstrInitialDir;
' LPCTSTR lpstrTitle;
' DWORD Flags;
' WORD nFileOffset;
' WORD nFileExtension;
' LPCTSTR lpstrDefExt;
' LPARAM lCustData;
' LPOFNHOOKPROC lpfnHook;
' LPCTSTR lpTemplateName;
'#if (_WIN32_WINNT >= 0x0500)
' void * pvReserved;
' DWORD dwReserved;
' DWORD FlagsEx;
'#endif // (_WIN32_WINNT >= 0x0500)
'} OPENFILENAME, *LPOPENFILENAME;
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
Public Class OpenFileName
Public structSize As Integer = 0
Public dlgOwner As IntPtr = IntPtr.Zero
Public instance As IntPtr = IntPtr.Zero
Public filter As String = Nothing
Public customFilter As String = Nothing
Public maxCustFilter As Integer = 0
Public filterIndex As Integer = 0
Public file As String = Nothing
Public maxFile As Integer = 0
Public fileTitle As String = Nothing
Public maxFileTitle As Integer = 0
Public initialDir As String = Nothing
Public title As String = Nothing
Public flags As Integer = 0
Public fileOffset As Short = 0
Public fileExtension As Short = 0
Public defExt As String = Nothing
Public custData As IntPtr = IntPtr.Zero
Public hook As IntPtr = IntPtr.Zero
Public templateName As String = Nothing
Public reservedPtr As IntPtr = IntPtr.Zero
Public reservedInt As Integer = 0
Public flagsEx As Integer = 0
End Class 'OpenFileName
Public Class LibWrap
'BOOL GetOpenFileName(LPOPENFILENAME lpofn);
Declare Auto Function GetOpenFileName Lib "Comdlg32.dll" ( _
<[In](), Out()> ByVal ofn As OpenFileName) As Boolean
End Class 'LibWrap
Private Function ShowOpen(Optional ByVal filter As String = ("All files" & ChrW(0) & "*.*" & ChrW(0)), _
Optional ByVal title As String = "Open File Dialog...", _
Optional ByVal defext As String = "*", _
Optional ByVal path As String = "C:\") As String
Try
Dim ofn As New OpenFileName
ofn.structSize = Marshal.SizeOf(ofn)
ofn.filter = filter
ofn.file = New String(New Char(256) {})
ofn.maxFile = ofn.file.Length
ofn.fileTitle = New String(New Char(64) {})
ofn.maxFileTitle = ofn.fileTitle.Length
ofn.initialDir = path
ofn.title = title
ofn.defExt = defext
If LibWrap.GetOpenFileName(ofn) Then
Console.WriteLine("Selected file with full path: {0}", ofn.file)
Console.WriteLine("Selected file name: {0}", ofn.fileTitle)
Console.WriteLine("Offset from file name: {0}", ofn.fileOffset)
Console.WriteLine("Offset from file extension: {0}", ofn.fileExtension)
Return ofn.file
End If
Catch ex As Exception
Debug.Assert(False)
Return System.String.Empty
End Try
End Function
tcc (http://bellard.org/tcc/) command line to compile:
tcc -lcomdlg32 openfilename.c
./openfilename.exe is 2,048 bytes !!!
gcc (under cygwin) command line to compile:
gcc -Wall -Wl,--enable-stdcall-fixup -mnop-fun-dllimport -mwindows getopenfilename.c
./a.exe is 61,414 bytes !!!
#include <windows.h>
// tinycc: pull info from CYGWIN header /usr/include/w32api/commdlg.h
#ifdef __TINYC__
#define OFN_READONLY 0x1
#define OFN_OVERWRITEPROMPT 0x2
#define OFN_HIDEREADONLY 0x4
#define OFN_NOCHANGEDIR 0x8
#define OFN_SHOWHELP 0x10
#define OFN_ENABLEHOOK 0x20
#define OFN_ENABLETEMPLATE 0x40
#define OFN_ENABLETEMPLATEHANDLE 0x80
#define OFN_NOVALIDATE 0x100
#define OFN_ALLOWMULTISELECT 0x200
#define OFN_EXTENSIONDIFFERENT 0x400
#define OFN_PATHMUSTEXIST 0x800
#define OFN_FILEMUSTEXIST 0x1000
#define OFN_CREATEPROMPT 0x2000
#define OFN_SHAREAWARE 0x4000
#define OFN_NOREADONLYRETURN 0x8000
#define OFN_NOTESTFILECREATE 0x10000
#define OFN_NONETWORKBUTTON 0x20000
#define OFN_NOLONGNAMES 0x40000
#define OFN_EXPLORER 0x80000
#define OFN_NODEREFERENCELINKS 0x100000
#define OFN_LONGNAMES 0x200000
#define OFN_ENABLEINCLUDENOTIFY 0x400000
#define OFN_ENABLESIZING 0x800000
#define OFN_DONTADDTORECENT 0x2000000
#define OFN_FORCESHOWHIDDEN 0x10000000
#define OFN_EX_NOPLACESBAR 0x1
#define OFN_SHAREFALLTHROUGH 2
#define OFN_SHARENOWARN 1
#define OFN_SHAREWARN 0
typedef UINT_PTR (CALLBACK *LPOFNHOOKPROC) (HWND,UINT,WPARAM,LPARAM);
typedef struct tagOFNA {
DWORD lStructSize;
HWND hwndOwner;
HINSTANCE hInstance;
LPCSTR lpstrFilter;
LPSTR lpstrCustomFilter;
DWORD nMaxCustFilter;
DWORD nFilterIndex;
LPSTR lpstrFile;
DWORD nMaxFile;
LPSTR lpstrFileTitle;
DWORD nMaxFileTitle;
LPCSTR lpstrInitialDir;
LPCSTR lpstrTitle;
DWORD Flags;
WORD nFileOffset;
WORD nFileExtension;
LPCSTR lpstrDefExt;
LPARAM lCustData;
LPOFNHOOKPROC lpfnHook;
LPCSTR lpTemplateName;
void *pvReserved;
DWORD dwReserved;
DWORD FlagsEx;
} OPENFILENAMEA,*LPOPENFILENAMEA;
#define OPENFILENAME OPENFILENAMEA
#define LPOPENFILENAME LPOPENFILENAMEA
#define GetOpenFileName GetOpenFileNameA
#endif
#ifdef __CYGWIN__
#include <commdlg.h>
#endif
// below adapted from: https://www.daniweb.com/software-development/cpp/code/217307/a-simple-getopenfilename-example
int main(int argc, char **argv) {
char szFile[100];
OPENFILENAME ofn;
memset(&ofn, 0, sizeof (ofn));
ofn.lStructSize = sizeof (ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof (szFile);
ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
int i = GetOpenFileName(&ofn);
return(i);
}
Contributed by John Refling