83 lines
2.2 KiB
C
83 lines
2.2 KiB
C
#include <windows.h>
|
|
#include <shobjidl.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
int main() {
|
|
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
|
|
if (FAILED(hr)) {
|
|
fprintf(stderr, "CoInitializeEx failed: 0x%lx\n", hr);
|
|
exit(1);
|
|
}
|
|
|
|
char file[MAX_PATH] = {0};
|
|
IFileSaveDialog *pFileSave = NULL;
|
|
IShellItem *pItem = NULL;
|
|
PWSTR pszFilePath = NULL;
|
|
|
|
hr = CoCreateInstance(&CLSID_FileSaveDialog, NULL, CLSCTX_ALL,
|
|
&IID_IFileSaveDialog, (void**)&pFileSave);
|
|
|
|
if (SUCCEEDED(hr)) {
|
|
COMDLG_FILTERSPEC rgSpec[] = {{L"All Files", L"*.*"}};
|
|
pFileSave->lpVtbl->SetFileTypes(pFileSave, ARRAYSIZE(rgSpec), rgSpec);
|
|
|
|
pFileSave->lpVtbl->SetTitle(pFileSave, L"Save File As");
|
|
|
|
DWORD dwFlags;
|
|
pFileSave->lpVtbl->GetOptions(pFileSave, &dwFlags);
|
|
pFileSave->lpVtbl->SetOptions(pFileSave, dwFlags | FOS_OVERWRITEPROMPT | FOS_PATHMUSTEXIST | FOS_NOCHANGEDIR);
|
|
|
|
hr = pFileSave->lpVtbl->Show(pFileSave, NULL);
|
|
|
|
if (SUCCEEDED(hr)) {
|
|
printf("GetResult...\n");
|
|
hr = pFileSave->lpVtbl->GetResult(pFileSave, &pItem);
|
|
|
|
if (SUCCEEDED(hr)) {
|
|
printf("GetDisplayName...\n");
|
|
hr = pItem->lpVtbl->GetDisplayName(pItem, SIGDN_FILESYSPATH, &pszFilePath);
|
|
|
|
if (SUCCEEDED(hr)) {
|
|
wcstombs(file, pszFilePath, MAX_PATH);
|
|
printf("Selected file: %s\n", file);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (pszFilePath) {
|
|
CoTaskMemFree(pszFilePath);
|
|
}
|
|
if (pItem) {
|
|
pItem->lpVtbl->Release(pItem);
|
|
}
|
|
if (pFileSave) {
|
|
pFileSave->lpVtbl->Release(pFileSave);
|
|
}
|
|
CoUninitialize();
|
|
|
|
if (FAILED(hr) || file[0] == '\0') {
|
|
puts("File selection cancelled or failed.");
|
|
exit(1);
|
|
}
|
|
|
|
FILE *f = fopen(file, "w");
|
|
if (!f) {
|
|
perror("Error opening file for writing");
|
|
exit(1);
|
|
}
|
|
|
|
if (fprintf(f, "foo") < 0) {
|
|
perror("Error writing to file");
|
|
fclose(f);
|
|
exit(1);
|
|
} else {
|
|
puts("Successfully wrote \"foo\" to the file.");
|
|
}
|
|
|
|
fclose(f);
|
|
|
|
return 0;
|
|
}
|