/* ANT_CANVAS::LOAD_FILE() ----------------------- */ long long ANT_canvas::load_file(void) { long long lines; IFileDialog *pfd = NULL; IShellItem *psiResult; DWORD dwFlags; PWSTR pszFilePath = NULL; char chosen_filter[1024]; char chosen_filename[MAX_PATH]; OPENFILENAME parameters; /* Create the Open Dialg object IFileDialog */ if ((CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pfd)) == S_OK)) { /* we're on VISTA / Windows 7 or later */ const COMDLG_FILTERSPEC c_rgSaveTypes[] = { {L"C/C++ files", L"*.c;*.cxx;*.cpp;*.h;*.hpp.*.hxx;*.mak;makefile"}, {L"All Documents (*.*)", L"*.*"} }; pfd->GetOptions(&dwFlags); pfd->SetOptions(dwFlags | FOS_FORCEFILESYSTEM); // we want to see a file pfd->SetFileTypes(ARRAYSIZE(c_rgSaveTypes), c_rgSaveTypes); pfd->SetFileTypeIndex(1); // first item in the list is the default pfd->SetDefaultExtension(L"doc;docx"); if (pfd->Show(NULL) == S_OK) { if (pfd->GetResult(&psiResult) == S_OK) // get the result object if the user clicks "Open" { psiResult->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath); lines = file->read_file((char *)pszFilePath); CoTaskMemFree(pszFilePath); psiResult->Release(); } } pfd->Release(); return lines; } else { /* we're on something prior to VISTA (NT through to XP) so use the old-style common control */ memset(chosen_filename, 0, sizeof(chosen_filename)); parameters.lStructSize = sizeof(parameters); parameters.hwndOwner = window; parameters.hInstance = hInstance; parameters.lpstrFilter = L"C/C++ files\0*.c;*.cxx;*.cpp;*.h;*.hpp.*.hxx\0\0\0"; parameters.lpstrCustomFilter = (LPWSTR)chosen_filter; parameters.nMaxCustFilter = sizeof(chosen_filter) - 1; parameters.nFilterIndex = 1; parameters.lpstrFile = (LPWSTR)chosen_filename; parameters.nMaxFile = sizeof(chosen_filename) - 1; parameters.lpstrFileTitle = NULL; parameters.nMaxFileTitle = 0; parameters.lpstrInitialDir = NULL; parameters.lpstrTitle = L"Open..."; parameters.Flags = OFN_LONGNAMES; parameters.nFileOffset = 0; parameters.nFileExtension = 0; parameters.lpstrDefExt = NULL; parameters.lCustData = 0; parameters.lpfnHook = NULL; parameters.lpTemplateName = 0; #if (_WIN32_WINNT >= 0x0500) parameters.pvReserved = NULL; parameters.dwReserved = 0; parameters.FlagsEx = 0; #endif if ((GetOpenFileNameW(¶meters)) != 0) return file->read_file((char *)parameters.lpstrFile); } return 0; }
HRESULT BasicFileOpen(PWSTR* filePath) { // CoCreate the File Open Dialog object. IFileDialog *pfd = NULL; HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pfd)); if (SUCCEEDED(hr)) { // Create an event handling object, and hook it up to the dialog. IFileDialogEvents *pfde = NULL; //DWORD dwCookie; // Set the options on the dialog. DWORD dwFlags; // Before setting, always get the options first in order // not to override existing options. hr = pfd->GetOptions(&dwFlags); if (SUCCEEDED(hr)) { // In this case, get shell items only for file system items. hr = pfd->SetOptions(dwFlags | FOS_FORCEFILESYSTEM); if (SUCCEEDED(hr)) { static const COMDLG_FILTERSPEC c_rgSaveTypes[] = { {L"Executable Files(*.exe)", L"*.exe"}, }; // Set the file types to display only. // Notice that this is a 1-based array. hr = pfd->SetFileTypes(ARRAYSIZE(c_rgSaveTypes), c_rgSaveTypes); if (SUCCEEDED(hr)) { // Set the selected file type index to Word Docs for this example. hr = pfd->SetFileTypeIndex(1); if (SUCCEEDED(hr)) { // Set the default extension to be ".doc" file. hr = pfd->SetDefaultExtension(L"exe"); if (SUCCEEDED(hr)) { // Show the dialog hr = pfd->Show(g_hwnd); if (SUCCEEDED(hr)) { // Obtain the result once the user clicks // the 'Open' button. // The result is an IShellItem object. IShellItem *psiResult; hr = pfd->GetResult(&psiResult); if (SUCCEEDED(hr)) { // We are just going to print out the // name of the file for sample sake. PWSTR pszFilePath = NULL; hr = psiResult->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath); if (SUCCEEDED(hr)) { *filePath=pszFilePath; } psiResult->Release(); } } } } } } } pfd->Release(); } else { hr=E_OUTOFMEMORY; OPENFILENAME ofn; LPWSTR pszFile=(LPWSTR)CoTaskMemAlloc(260*2); if(pszFile!=NULL) { memset1(&ofn,0,sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = g_hwnd; ofn.lpstrFile = pszFile; // Set lpstrFile[0] to '\0' so that GetOpenFileName does not // use the contents of szFile to initialize itself. ofn.lpstrFile[0] = L'\0'; ofn.nMaxFile = 260; ofn.lpstrFilter = L"Executable Files(*.exe)\0*.exe\0"; ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; if (GetOpenFileName(&ofn)==TRUE) { *filePath=pszFile; hr=0; } } } return hr; }