diff --git a/Files.sln b/Files.sln
index 90bc29212123..c7596cf29feb 100644
--- a/Files.sln
+++ b/Files.sln
@@ -6,6 +6,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Files.FullTrust", "src\File
ProjectSection(ProjectDependencies) = postProject
{A2FF3F3B-8EBC-4108-B99D-1476B7876656} = {A2FF3F3B-8EBC-4108-B99D-1476B7876656}
{25FD5045-6D4C-4DD0-B3AC-613AB59CBB07} = {25FD5045-6D4C-4DD0-B3AC-613AB59CBB07}
+ {EBFA367F-CBDB-4CD0-B838-D6B95F61D1F6} = {EBFA367F-CBDB-4CD0-B838-D6B95F61D1F6}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Files.Uwp", "src\Files.Uwp\Files.Uwp.csproj", "{64C30C4E-A69A-411C-9F78-776E7AAD583C}"
@@ -20,6 +21,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "FilesOpenDialog", "FilesOpe
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CustomOpenDialog", "src\Files.OpenDialog\CustomOpenDialog\CustomOpenDialog.vcxproj", "{A2FF3F3B-8EBC-4108-B99D-1476B7876656}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CustomSaveDialog", "src\Files.OpenDialog\CustomSaveDialog\CustomSaveDialog.vcxproj", "{EBFA367F-CBDB-4CD0-B838-D6B95F61D1F6}"
+EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Files.InteractionTests", "tests\Files.InteractionTests\Files.InteractionTests.csproj", "{B7E43D1F-AC8B-4958-95D5-A06CDD1FEACD}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A74DCE98-A744-4D71-A2B1-7EE4FED0936B}"
@@ -75,15 +78,12 @@ Global
{64C30C4E-A69A-411C-9F78-776E7AAD583C}.Release|x64.Build.0 = Release|x64
{64C30C4E-A69A-411C-9F78-776E7AAD583C}.Release|x86.ActiveCfg = Release|x86
{64C30C4E-A69A-411C-9F78-776E7AAD583C}.Release|x86.Build.0 = Release|x86
- {64C30C4E-A69A-411C-9F78-776E7AAD583C}.Sideload|arm64.ActiveCfg = Sideload|Any CPU
- {64C30C4E-A69A-411C-9F78-776E7AAD583C}.Sideload|arm64.Build.0 = Sideload|Any CPU
- {64C30C4E-A69A-411C-9F78-776E7AAD583C}.Sideload|arm64.Deploy.0 = Sideload|Any CPU
+ {64C30C4E-A69A-411C-9F78-776E7AAD583C}.Sideload|arm64.ActiveCfg = Sideload|arm64
+ {64C30C4E-A69A-411C-9F78-776E7AAD583C}.Sideload|arm64.Build.0 = Sideload|arm64
{64C30C4E-A69A-411C-9F78-776E7AAD583C}.Sideload|x64.ActiveCfg = Sideload|x64
{64C30C4E-A69A-411C-9F78-776E7AAD583C}.Sideload|x64.Build.0 = Sideload|x64
- {64C30C4E-A69A-411C-9F78-776E7AAD583C}.Sideload|x64.Deploy.0 = Sideload|x64
{64C30C4E-A69A-411C-9F78-776E7AAD583C}.Sideload|x86.ActiveCfg = Sideload|Win32
{64C30C4E-A69A-411C-9F78-776E7AAD583C}.Sideload|x86.Build.0 = Sideload|Win32
- {64C30C4E-A69A-411C-9F78-776E7AAD583C}.Sideload|x86.Deploy.0 = Sideload|Win32
{3B15596C-3DB9-4B58-B4C8-442D06A8C130}.Debug|arm64.ActiveCfg = Debug|arm64
{3B15596C-3DB9-4B58-B4C8-442D06A8C130}.Debug|arm64.Build.0 = Debug|arm64
{3B15596C-3DB9-4B58-B4C8-442D06A8C130}.Debug|arm64.Deploy.0 = Debug|arm64
@@ -161,8 +161,8 @@ Global
{A2FF3F3B-8EBC-4108-B99D-1476B7876656}.Release|x86.Build.0 = Release|Win32
{A2FF3F3B-8EBC-4108-B99D-1476B7876656}.Sideload|arm64.ActiveCfg = Release|arm64
{A2FF3F3B-8EBC-4108-B99D-1476B7876656}.Sideload|arm64.Build.0 = Release|arm64
- {A2FF3F3B-8EBC-4108-B99D-1476B7876656}.Sideload|x64.ActiveCfg = Debug|x64
- {A2FF3F3B-8EBC-4108-B99D-1476B7876656}.Sideload|x64.Build.0 = Debug|x64
+ {A2FF3F3B-8EBC-4108-B99D-1476B7876656}.Sideload|x64.ActiveCfg = Release|x64
+ {A2FF3F3B-8EBC-4108-B99D-1476B7876656}.Sideload|x64.Build.0 = Release|x64
{A2FF3F3B-8EBC-4108-B99D-1476B7876656}.Sideload|x86.ActiveCfg = Release|Win32
{A2FF3F3B-8EBC-4108-B99D-1476B7876656}.Sideload|x86.Build.0 = Release|Win32
{B7E43D1F-AC8B-4958-95D5-A06CDD1FEACD}.Debug|arm64.ActiveCfg = Debug|Any CPU
@@ -219,6 +219,24 @@ Global
{25FD5045-6D4C-4DD0-B3AC-613AB59CBB07}.Sideload|x64.Build.0 = Debug|x64
{25FD5045-6D4C-4DD0-B3AC-613AB59CBB07}.Sideload|x86.ActiveCfg = Release|Win32
{25FD5045-6D4C-4DD0-B3AC-613AB59CBB07}.Sideload|x86.Build.0 = Release|Win32
+ {EBFA367F-CBDB-4CD0-B838-D6B95F61D1F6}.Debug|arm64.ActiveCfg = Debug|arm64
+ {EBFA367F-CBDB-4CD0-B838-D6B95F61D1F6}.Debug|arm64.Build.0 = Debug|arm64
+ {EBFA367F-CBDB-4CD0-B838-D6B95F61D1F6}.Debug|x64.ActiveCfg = Debug|x64
+ {EBFA367F-CBDB-4CD0-B838-D6B95F61D1F6}.Debug|x64.Build.0 = Debug|x64
+ {EBFA367F-CBDB-4CD0-B838-D6B95F61D1F6}.Debug|x86.ActiveCfg = Debug|Win32
+ {EBFA367F-CBDB-4CD0-B838-D6B95F61D1F6}.Debug|x86.Build.0 = Debug|Win32
+ {EBFA367F-CBDB-4CD0-B838-D6B95F61D1F6}.Release|arm64.ActiveCfg = Release|arm64
+ {EBFA367F-CBDB-4CD0-B838-D6B95F61D1F6}.Release|arm64.Build.0 = Release|arm64
+ {EBFA367F-CBDB-4CD0-B838-D6B95F61D1F6}.Release|x64.ActiveCfg = Release|x64
+ {EBFA367F-CBDB-4CD0-B838-D6B95F61D1F6}.Release|x64.Build.0 = Release|x64
+ {EBFA367F-CBDB-4CD0-B838-D6B95F61D1F6}.Release|x86.ActiveCfg = Release|Win32
+ {EBFA367F-CBDB-4CD0-B838-D6B95F61D1F6}.Release|x86.Build.0 = Release|Win32
+ {EBFA367F-CBDB-4CD0-B838-D6B95F61D1F6}.Sideload|arm64.ActiveCfg = Release|arm64
+ {EBFA367F-CBDB-4CD0-B838-D6B95F61D1F6}.Sideload|arm64.Build.0 = Release|arm64
+ {EBFA367F-CBDB-4CD0-B838-D6B95F61D1F6}.Sideload|x64.ActiveCfg = Release|x64
+ {EBFA367F-CBDB-4CD0-B838-D6B95F61D1F6}.Sideload|x64.Build.0 = Release|x64
+ {EBFA367F-CBDB-4CD0-B838-D6B95F61D1F6}.Sideload|x86.ActiveCfg = Release|Win32
+ {EBFA367F-CBDB-4CD0-B838-D6B95F61D1F6}.Sideload|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -235,6 +253,7 @@ Global
{A188C26B-E731-4E0B-9D17-D21CEBD9B43F} = {A74DCE98-A744-4D71-A2B1-7EE4FED0936B}
{4CFE0BBC-8D07-49A0-8B10-4EDD61ABCF57} = {A188C26B-E731-4E0B-9D17-D21CEBD9B43F}
{25FD5045-6D4C-4DD0-B3AC-613AB59CBB07} = {0175B70C-1E29-4A3F-AA4F-C2017B040EF0}
+ {EBFA367F-CBDB-4CD0-B838-D6B95F61D1F6} = {0175B70C-1E29-4A3F-AA4F-C2017B040EF0}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {0E62043C-A7A1-4982-9EC9-4CDB2939B776}
diff --git a/src/Files.FullTrust/Files.FullTrust.csproj b/src/Files.FullTrust/Files.FullTrust.csproj
index e15a39c85a20..0f5c0c674ca0 100644
--- a/src/Files.FullTrust/Files.FullTrust.csproj
+++ b/src/Files.FullTrust/Files.FullTrust.csproj
@@ -54,6 +54,9 @@
+
+
+
diff --git a/src/Files.FullTrust/MessageHandlers/Win32MessageHandler.cs b/src/Files.FullTrust/MessageHandlers/Win32MessageHandler.cs
index 03f036f04e4f..255ee0c5e776 100644
--- a/src/Files.FullTrust/MessageHandlers/Win32MessageHandler.cs
+++ b/src/Files.FullTrust/MessageHandlers/Win32MessageHandler.cs
@@ -51,8 +51,11 @@ private static void DetectIsSetAsDefaultFileManager()
private static void DetectIsSetAsOpenFileDialog()
{
- using var subkey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Classes\CLSID\{DC1C5A9C-E88A-4DDE-A5A1-60F82A20AEF7}");
- ApplicationData.Current.LocalSettings.Values["IsSetAsOpenFileDialog"] = subkey?.GetValue(string.Empty) as string == "FilesOpenDialog class";
+ using var subkeyOpen = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Classes\CLSID\{DC1C5A9C-E88A-4DDE-A5A1-60F82A20AEF7}");
+ using var subkeySave = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Classes\CLSID\{C0B4E2F3-BA21-4773-8DBA-335EC946EB8B}");
+ var isSetAsOpenDialog = subkeyOpen?.GetValue(string.Empty) as string == "FilesOpenDialog class";
+ var isSetAsSaveDialog = subkeySave?.GetValue(string.Empty) as string == "FilesSaveDialog class";
+ ApplicationData.Current.LocalSettings.Values["IsSetAsOpenFileDialog"] = isSetAsOpenDialog || isSetAsSaveDialog;
}
public async Task ParseArgumentsAsync(PipeStream connection, Dictionary message, string arguments)
@@ -261,12 +264,18 @@ public async Task ParseArgumentsAsync(PipeStream connection, Dictionary
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
-
{93995380-89BD-4b04-88EB-625FBE52EBFB}
h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd
@@ -17,6 +13,9 @@
{abc5c222-f2d9-4149-b7c5-c26f1a437824}
False
+
+ {61930b81-88a9-49a7-9dff-ba407cac44b7}
+
@@ -31,9 +30,6 @@
File di intestazione
-
- File generati
-
File di intestazione
@@ -43,6 +39,9 @@
File di intestazione
+
+ File generati
+
@@ -51,14 +50,14 @@
File di origine
-
- File generati
+
+ File di origine
File di origine
-
- File di origine
+
+ File generati
@@ -70,12 +69,12 @@
File di risorse
-
- File di origine
-
File di risorse
+
+ File di origine
+
diff --git a/src/Files.OpenDialog/CustomOpenDialog/FilesOpenDialog.cpp b/src/Files.OpenDialog/CustomOpenDialog/FilesOpenDialog.cpp
index 1f675f3d8c84..05325af4cb0e 100644
--- a/src/Files.OpenDialog/CustomOpenDialog/FilesOpenDialog.cpp
+++ b/src/Files.OpenDialog/CustomOpenDialog/FilesOpenDialog.cpp
@@ -315,7 +315,7 @@ HRESULT __stdcall CFilesOpenDialog::GetFileName(LPWSTR* pszName)
HRESULT __stdcall CFilesOpenDialog::SetTitle(LPCWSTR pszTitle)
{
- cout << "SetTitle, title: " << pszTitle << endl;
+ wcout << L"SetTitle, title: " << pszTitle << endl;
#ifdef SYSTEMDIALOG
return _systemDialog->SetTitle(pszTitle);
#endif
@@ -324,7 +324,7 @@ HRESULT __stdcall CFilesOpenDialog::SetTitle(LPCWSTR pszTitle)
HRESULT __stdcall CFilesOpenDialog::SetOkButtonLabel(LPCWSTR pszText)
{
- cout << "SetOkButtonLabel, pszText: " << pszText << endl;
+ wcout << L"SetOkButtonLabel, pszText: " << pszText << endl;
#ifdef SYSTEMDIALOG
return _systemDialog->SetOkButtonLabel(pszText);
#endif
@@ -333,7 +333,7 @@ HRESULT __stdcall CFilesOpenDialog::SetOkButtonLabel(LPCWSTR pszText)
HRESULT __stdcall CFilesOpenDialog::SetFileNameLabel(LPCWSTR pszLabel)
{
- cout << "SetFileNameLabel, pszLabel: " << pszLabel << endl;
+ wcout << L"SetFileNameLabel, pszLabel: " << pszLabel << endl;
#ifdef SYSTEMDIALOG
return _systemDialog->SetFileNameLabel(pszLabel);
#endif
@@ -370,7 +370,7 @@ HRESULT __stdcall CFilesOpenDialog::AddPlace(IShellItem* psi, FDAP fdap)
HRESULT __stdcall CFilesOpenDialog::SetDefaultExtension(LPCWSTR pszDefaultExtension)
{
- cout << "SetDefaultExtension, pszDefaultExtension: " << pszDefaultExtension << endl;
+ wcout << L"SetDefaultExtension, pszDefaultExtension: " << pszDefaultExtension << endl;
#ifdef SYSTEMDIALOG
return _systemDialog->SetDefaultExtension(pszDefaultExtension);
#endif
diff --git a/src/Files.OpenDialog/CustomSaveDialog/CustomSaveDialog.cpp b/src/Files.OpenDialog/CustomSaveDialog/CustomSaveDialog.cpp
new file mode 100644
index 000000000000..2f9ccaf5f861
--- /dev/null
+++ b/src/Files.OpenDialog/CustomSaveDialog/CustomSaveDialog.cpp
@@ -0,0 +1,74 @@
+// CustomSaveDialog.cpp: implementazione delle esportazioni DLL.
+
+
+#include "pch.h"
+#include "framework.h"
+#include "resource.h"
+#include "CustomSaveDialog_i.h"
+#include "dllmain.h"
+
+
+using namespace ATL;
+
+// Utilizzato per determinare se la DLL può essere scaricata da OLE.
+_Use_decl_annotations_
+STDAPI DllCanUnloadNow(void)
+{
+ return _AtlModule.DllCanUnloadNow();
+}
+
+// Restituisce una class factory per creare un oggetto del tipo richiesto.
+_Use_decl_annotations_
+STDAPI DllGetClassObject(_In_ REFCLSID rclsid, _In_ REFIID riid, _Outptr_ LPVOID* ppv)
+{
+ return _AtlModule.DllGetClassObject(rclsid, riid, ppv);
+}
+
+// DllRegisterServer: aggiunge voci al Registro di sistema.
+_Use_decl_annotations_
+STDAPI DllRegisterServer(void)
+{
+ // registra gli oggetti, le librerie dei tipi e tutte le interfacce della libreria dei tipi
+ HRESULT hr = _AtlModule.DllRegisterServer();
+ return hr;
+}
+
+// DllUnregisterServer: rimuove voci dal Registro di sistema.
+_Use_decl_annotations_
+STDAPI DllUnregisterServer(void)
+{
+ HRESULT hr = _AtlModule.DllUnregisterServer();
+ return hr;
+}
+
+// DllInstall: aggiunge/rimuove voci nel Registro di sistema per ogni utente di ciascun computer.
+STDAPI DllInstall(BOOL bInstall, _In_opt_ LPCWSTR pszCmdLine)
+{
+ HRESULT hr = E_FAIL;
+ static const wchar_t szUserSwitch[] = L"user";
+
+ if (pszCmdLine != nullptr)
+ {
+ if (_wcsnicmp(pszCmdLine, szUserSwitch, _countof(szUserSwitch)) == 0)
+ {
+ ATL::AtlSetPerUserRegistration(true);
+ }
+ }
+
+ if (bInstall)
+ {
+ hr = DllRegisterServer();
+ if (FAILED(hr))
+ {
+ DllUnregisterServer();
+ }
+ }
+ else
+ {
+ hr = DllUnregisterServer();
+ }
+
+ return hr;
+}
+
+
diff --git a/src/Files.OpenDialog/CustomSaveDialog/CustomSaveDialog.def b/src/Files.OpenDialog/CustomSaveDialog/CustomSaveDialog.def
new file mode 100644
index 000000000000..127dec0267e2
--- /dev/null
+++ b/src/Files.OpenDialog/CustomSaveDialog/CustomSaveDialog.def
@@ -0,0 +1,10 @@
+; CustomSaveDialog.def: dichiara i parametri del modulo.
+
+LIBRARY
+
+EXPORTS
+ DllCanUnloadNow PRIVATE
+ DllGetClassObject PRIVATE
+ DllRegisterServer PRIVATE
+ DllUnregisterServer PRIVATE
+ DllInstall PRIVATE
diff --git a/src/Files.OpenDialog/CustomSaveDialog/CustomSaveDialog.idl b/src/Files.OpenDialog/CustomSaveDialog/CustomSaveDialog.idl
new file mode 100644
index 000000000000..d2b45059fdfa
--- /dev/null
+++ b/src/Files.OpenDialog/CustomSaveDialog/CustomSaveDialog.idl
@@ -0,0 +1,32 @@
+// CustomSaveDialog.idl: origine IDL per CustomSaveDialog
+//
+
+// Questo file verrà elaborato dallo strumento MIDL per
+// produce la libreria dei tipi (CustomSaveDialog.tlb) e il codice di marshalling.
+
+import "oaidl.idl";
+import "ocidl.idl";
+
+[
+ uuid(21533617-c1cd-4d33-a190-21fb069b55f4),
+ version(1.0),
+]
+library CustomSaveDialogLib
+{
+ importlib("stdole2.tlb");
+ [
+ uuid(C0B4E2F3-BA21-4773-8DBA-335EC946EB8B)
+ ]
+ coclass FilesSaveDialog
+ {
+ [default] interface IFileSaveDialog;
+ interface IFileDialog;
+ interface IFileDialogCustomize;
+ interface IFileDialog2;
+ interface IObjectWithSite;
+ //interface IFileDialogPrivate;
+ interface IOleWindow;
+ };
+};
+
+import "shobjidl.idl";
diff --git a/src/Files.OpenDialog/CustomSaveDialog/CustomSaveDialog.rc b/src/Files.OpenDialog/CustomSaveDialog/CustomSaveDialog.rc
new file mode 100644
index 000000000000..deda272e17a1
Binary files /dev/null and b/src/Files.OpenDialog/CustomSaveDialog/CustomSaveDialog.rc differ
diff --git a/src/Files.OpenDialog/CustomSaveDialog/CustomSaveDialog.rgs b/src/Files.OpenDialog/CustomSaveDialog/CustomSaveDialog.rgs
new file mode 100644
index 000000000000..e7d37400e19a
--- /dev/null
+++ b/src/Files.OpenDialog/CustomSaveDialog/CustomSaveDialog.rgs
@@ -0,0 +1,3 @@
+HKCR
+{
+}
diff --git a/src/Files.OpenDialog/CustomSaveDialog/CustomSaveDialog.vcxproj b/src/Files.OpenDialog/CustomSaveDialog/CustomSaveDialog.vcxproj
new file mode 100644
index 000000000000..2d5b9a0411c7
--- /dev/null
+++ b/src/Files.OpenDialog/CustomSaveDialog/CustomSaveDialog.vcxproj
@@ -0,0 +1,308 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+ 16.0
+ {EBFA367F-CBDB-4CD0-B838-D6B95F61D1F6}
+ AtlProj
+ 10.0
+
+
+
+ DynamicLibrary
+ true
+ v143
+ Unicode
+
+
+ DynamicLibrary
+ false
+ v143
+ Unicode
+
+
+ DynamicLibrary
+ true
+ v143
+ Unicode
+
+
+ DynamicLibrary
+ false
+ v143
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ true
+ ..\artifacts\$(Configuration)\$(Platform)\$(MSBuildProjectName)\
+ CustomSaveDialog$(PlatformArchitecture)
+
+
+ true
+ true
+ ..\artifacts\$(Configuration)\$(Platform)\$(MSBuildProjectName)\
+ CustomSaveDialog$(PlatformArchitecture)
+
+
+ true
+ false
+ ..\artifacts\$(Configuration)\$(Platform)\$(MSBuildProjectName)\
+ CustomSaveDialog$(PlatformArchitecture)
+
+
+ true
+ false
+ ..\artifacts\$(Configuration)\$(Platform)\$(MSBuildProjectName)\
+ CustomSaveDialog$(PlatformArchitecture)
+
+
+
+ Use
+ Level3
+ Disabled
+ _WINDOWS;_DEBUG;_USRDLL;%(PreprocessorDefinitions)
+ pch.h
+ true
+
+
+ false
+ _DEBUG;%(PreprocessorDefinitions)
+ CustomSaveDialog_i.h
+ CustomSaveDialog_i.c
+ CustomSaveDialog_p.c
+ true
+ $(IntDir)CustomSaveDialog.tlb
+
+ true
+
+
+ 0x0410
+ $(IntDir);%(AdditionalIncludeDirectories)
+ _DEBUG;%(PreprocessorDefinitions)
+
+
+ Windows
+ .\CustomSaveDialog.def
+ false
+ true
+ $(OutDir)CustomSaveDialog$(PlatformArchitecture)$(TargetExt)
+
+
+ xcopy /s /y "$(ProjectDir)$(OutDir)*.dll" "$(ProjectDir)..\..\..\src\Files.FullTrust\Assets\FilesOpenDialog"
+
+
+
+
+ Use
+ Level3
+ Disabled
+ WIN32;_WINDOWS;_DEBUG;_USRDLL;%(PreprocessorDefinitions)
+ pch.h
+ true
+
+
+ false
+ Win32
+ _DEBUG;%(PreprocessorDefinitions)
+ CustomSaveDialog_i.h
+ CustomSaveDialog_i.c
+ CustomSaveDialog_p.c
+ true
+ $(IntDir)CustomSaveDialog.tlb
+
+ true
+
+
+ 0x0410
+ $(IntDir);%(AdditionalIncludeDirectories)
+ _DEBUG;%(PreprocessorDefinitions)
+
+
+ Windows
+ .\CustomSaveDialog.def
+ false
+ true
+ $(OutDir)CustomSaveDialog$(PlatformArchitecture)$(TargetExt)
+
+
+ xcopy /s /y "$(ProjectDir)$(OutDir)*.dll" "$(ProjectDir)..\..\..\src\Files.FullTrust\Assets\FilesOpenDialog"
+
+
+
+
+ Use
+ Level3
+ MaxSpeed
+ WIN32;_WINDOWS;NDEBUG;_USRDLL;%(PreprocessorDefinitions)
+ pch.h
+ true
+
+
+ false
+ Win32
+ NDEBUG;%(PreprocessorDefinitions)
+ CustomSaveDialog_i.h
+ CustomSaveDialog_i.c
+ CustomSaveDialog_p.c
+ true
+ $(IntDir)CustomSaveDialog.tlb
+
+ true
+
+
+ 0x0410
+ $(IntDir);%(AdditionalIncludeDirectories)
+ NDEBUG;%(PreprocessorDefinitions)
+
+
+ Windows
+ .\CustomSaveDialog.def
+ true
+ true
+ false
+ true
+ $(OutDir)CustomSaveDialog$(PlatformArchitecture)$(TargetExt)
+
+
+ xcopy /s /y "$(ProjectDir)$(OutDir)*.dll" "$(ProjectDir)..\..\..\src\Files.FullTrust\Assets\FilesOpenDialog"
+
+
+
+
+ Use
+ Level3
+ MaxSpeed
+ _WINDOWS;NDEBUG;_USRDLL;%(PreprocessorDefinitions)
+ pch.h
+ true
+
+
+ false
+ NDEBUG;%(PreprocessorDefinitions)
+ CustomSaveDialog_i.h
+ CustomSaveDialog_i.c
+ CustomSaveDialog_p.c
+ true
+ $(IntDir)CustomSaveDialog.tlb
+
+ true
+
+
+ 0x0410
+ $(IntDir);%(AdditionalIncludeDirectories)
+ NDEBUG;%(PreprocessorDefinitions)
+
+
+ Windows
+ .\CustomSaveDialog.def
+ true
+ true
+ false
+ true
+ $(OutDir)CustomSaveDialog$(PlatformArchitecture)$(TargetExt)
+
+
+ xcopy /s /y "$(ProjectDir)$(OutDir)*.dll" "$(ProjectDir)..\..\..\src\Files.FullTrust\Assets\FilesOpenDialog"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ false
+ false
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+ false
+ false
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+ Create
+ Create
+ Create
+ Create
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Files.OpenDialog/CustomSaveDialog/CustomSaveDialog.vcxproj.filters b/src/Files.OpenDialog/CustomSaveDialog/CustomSaveDialog.vcxproj.filters
new file mode 100644
index 000000000000..a3c5c5a147aa
--- /dev/null
+++ b/src/Files.OpenDialog/CustomSaveDialog/CustomSaveDialog.vcxproj.filters
@@ -0,0 +1,91 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+ {487d0712-ae0c-468f-9ef2-12da6ffc5361}
+ False
+
+
+
+
+ File di intestazione
+
+
+ File di intestazione
+
+
+ File di intestazione
+
+
+ File di intestazione
+
+
+ File di intestazione
+
+
+ File di intestazione
+
+
+ File di intestazione
+
+
+ File generati
+
+
+ File di intestazione
+
+
+
+
+ File di origine
+
+
+ File di origine
+
+
+ File di origine
+
+
+ File di origine
+
+
+ File generati
+
+
+ File di origine
+
+
+
+
+ File di risorse
+
+
+
+
+ File di risorse
+
+
+ File di origine
+
+
+ File di risorse
+
+
+
+
+ File di origine
+
+
+
\ No newline at end of file
diff --git a/src/Files.OpenDialog/CustomSaveDialog/CustomSaveDialogps.def b/src/Files.OpenDialog/CustomSaveDialog/CustomSaveDialogps.def
new file mode 100644
index 000000000000..2a4265afa9fb
--- /dev/null
+++ b/src/Files.OpenDialog/CustomSaveDialog/CustomSaveDialogps.def
@@ -0,0 +1,8 @@
+
+LIBRARY
+
+EXPORTS
+ DllGetClassObject PRIVATE
+ DllCanUnloadNow PRIVATE
+ DllRegisterServer PRIVATE
+ DllUnregisterServer PRIVATE
diff --git a/src/Files.OpenDialog/CustomSaveDialog/FilesDialogEvents.cpp b/src/Files.OpenDialog/CustomSaveDialog/FilesDialogEvents.cpp
new file mode 100644
index 000000000000..527c45efe244
--- /dev/null
+++ b/src/Files.OpenDialog/CustomSaveDialog/FilesDialogEvents.cpp
@@ -0,0 +1,84 @@
+#include "pch.h"
+#include "FilesDialogEvents.h"
+#include
+
+using std::cout;
+using std::wcout;
+using std::endl;
+
+FilesDialogEvents::FilesDialogEvents(IFileDialogEvents* evt, IFileDialog* cust)
+{
+ _evt = evt;
+ _cust = cust;
+}
+
+HRESULT __stdcall FilesDialogEvents::QueryInterface(REFIID riid, void** ppvObject)
+{
+ HRESULT res = _evt->QueryInterface(riid, ppvObject);
+ OLECHAR* guidString;
+ (void)StringFromCLSID(riid, &guidString);
+ std::wcout << L"Event: QueryInterface: " << guidString << L" = " << res << std::endl;
+ ::CoTaskMemFree(guidString);
+ return res;
+}
+
+ULONG __stdcall FilesDialogEvents::AddRef(void)
+{
+ cout << "Event: AddRef" << endl;
+ return _evt->AddRef();
+}
+
+ULONG __stdcall FilesDialogEvents::Release(void)
+{
+ cout << "Event: Release" << endl;
+ return _evt->Release();
+}
+
+HRESULT __stdcall FilesDialogEvents::OnFileOk(IFileDialog* pfd)
+{
+ cout << "Event: PRE OnFileOk" << endl;
+ HRESULT res = _evt->OnFileOk(_cust);
+ cout << "Event: OnFileOk = " << res << endl;
+ return res;
+}
+
+HRESULT __stdcall FilesDialogEvents::OnFolderChanging(IFileDialog* pfd, IShellItem* psiFolder)
+{
+ HRESULT res = _evt->OnFolderChanging(_cust, psiFolder);
+ cout << "Event: OnFolderChanging = " << res << endl;
+ return res;
+}
+
+HRESULT __stdcall FilesDialogEvents::OnFolderChange(IFileDialog* pfd)
+{
+ HRESULT res = _evt->OnFolderChange(_cust);
+ cout << "Event: OnFolderChange = " << res << endl;
+ return res;
+}
+
+HRESULT __stdcall FilesDialogEvents::OnSelectionChange(IFileDialog* pfd)
+{
+ HRESULT res = _evt->OnSelectionChange(_cust);
+ cout << "Event: OnSelectionChange = " << res << endl;
+ return res;
+}
+
+HRESULT __stdcall FilesDialogEvents::OnShareViolation(IFileDialog* pfd, IShellItem* psi, FDE_SHAREVIOLATION_RESPONSE* pResponse)
+{
+ cout << "Event: OnShareViolation" << endl;
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall FilesDialogEvents::OnTypeChange(IFileDialog* pfd)
+{
+ HRESULT res = _evt->OnTypeChange(_cust);
+ cout << "Event: OnTypeChange = " << res << endl;
+ return res;
+}
+
+HRESULT __stdcall FilesDialogEvents::OnOverwrite(IFileDialog* pfd, IShellItem* psi, FDE_OVERWRITE_RESPONSE* pResponse)
+{
+ HRESULT res = _evt->OnOverwrite(_cust, psi, pResponse);
+ cout << "Event: OnOverwrite = " << res << ", " << *pResponse << endl;
+ return res;
+}
diff --git a/src/Files.OpenDialog/CustomSaveDialog/FilesDialogEvents.h b/src/Files.OpenDialog/CustomSaveDialog/FilesDialogEvents.h
new file mode 100644
index 000000000000..26a4a72208ef
--- /dev/null
+++ b/src/Files.OpenDialog/CustomSaveDialog/FilesDialogEvents.h
@@ -0,0 +1,27 @@
+#pragma once
+#include "resource.h" // simboli principali
+
+#include "oaidl.h"
+#include "ocidl.h"
+#include "shobjidl.h"
+
+class FilesDialogEvents : public IFileDialogEvents
+{
+ IFileDialogEvents* _evt;
+ IFileDialog* _cust;
+
+public:
+ FilesDialogEvents(IFileDialogEvents* evt, IFileDialog *cust);
+
+ // Ereditato tramite IFileDialogEvents
+ HRESULT __stdcall QueryInterface(REFIID riid, void** ppvObject) override;
+ ULONG __stdcall AddRef(void) override;
+ ULONG __stdcall Release(void) override;
+ HRESULT __stdcall OnFileOk(IFileDialog* pfd) override;
+ HRESULT __stdcall OnFolderChanging(IFileDialog* pfd, IShellItem* psiFolder) override;
+ HRESULT __stdcall OnFolderChange(IFileDialog* pfd) override;
+ HRESULT __stdcall OnSelectionChange(IFileDialog* pfd) override;
+ HRESULT __stdcall OnShareViolation(IFileDialog* pfd, IShellItem* psi, FDE_SHAREVIOLATION_RESPONSE* pResponse) override;
+ HRESULT __stdcall OnTypeChange(IFileDialog* pfd) override;
+ HRESULT __stdcall OnOverwrite(IFileDialog* pfd, IShellItem* psi, FDE_OVERWRITE_RESPONSE* pResponse) override;
+};
diff --git a/src/Files.OpenDialog/CustomSaveDialog/FilesSaveDialog.cpp b/src/Files.OpenDialog/CustomSaveDialog/FilesSaveDialog.cpp
new file mode 100644
index 000000000000..9fc528ba6d4c
--- /dev/null
+++ b/src/Files.OpenDialog/CustomSaveDialog/FilesSaveDialog.cpp
@@ -0,0 +1,1070 @@
+// FilesSaveDialog.cpp: implementazione di CFilesSaveDialog
+
+#include "pch.h"
+#include "FilesDialogEvents.h"
+#include "FilesSaveDialog.h"
+#include
+#include
+#include
+#include
+#include
+#include
+
+//#define SYSTEMDIALOG
+
+using std::cout;
+using std::wcout;
+using std::endl;
+
+// CFilesSaveDialog
+
+CComPtr GetSystemDialog()
+{
+ HINSTANCE lib = CoLoadLibrary(L"C:\\Windows\\System32\\comdlg32.dll", false);
+ BOOL(WINAPI * dllGetClassObject)(REFCLSID, REFIID, LPVOID*) =
+ (BOOL(WINAPI*)(REFCLSID, REFIID, LPVOID*))GetProcAddress(lib, "DllGetClassObject");
+ CComPtr pClassFactory;
+ dllGetClassObject(CLSID_FileSaveDialog, IID_IClassFactory, (void**)&pClassFactory);
+ CComPtr systemDialog;
+ pClassFactory->CreateInstance(NULL, IID_IFileSaveDialog, (void**)&systemDialog);
+ //CoFreeLibrary(lib);
+ return systemDialog;
+}
+
+IShellItem* CloneShellItem(IShellItem* psi)
+{
+ IShellItem* item = NULL;
+ if (psi)
+ {
+ PIDLIST_ABSOLUTE pidl;
+ if (SUCCEEDED(SHGetIDListFromObject(psi, &pidl)))
+ {
+ SHCreateItemFromIDList(pidl, IID_IShellItem, (void**)&item);
+ CoTaskMemFree(pidl);
+ }
+ }
+ return item;
+}
+
+template
+CComPtr AsInterface(CComPtr dialog)
+{
+ CComPtr dialogInterface;
+ dialog->QueryInterface(&dialogInterface);
+ return dialogInterface;
+}
+
+CFilesSaveDialog::CFilesSaveDialog()
+{
+ _fos = FOS_PATHMUSTEXIST;
+ _systemDialog = nullptr;
+ _debugStream = NULL;
+ _dialogEvents = NULL;
+
+ PWSTR pszPath = NULL;
+ HRESULT hr = SHGetKnownFolderPath(FOLDERID_Desktop, 0, NULL, &pszPath);
+ if (SUCCEEDED(hr))
+ {
+ TCHAR debugPath[MAX_PATH];
+ wsprintf(debugPath, L"%s\\%s", pszPath, L"save_dialog.txt");
+#ifdef DEBUGLOG
+ _wfreopen_s(&_debugStream, debugPath, L"w", stdout);
+#endif
+ CoTaskMemFree(pszPath);
+ }
+ cout << "Create" << endl;
+
+ TCHAR tempPath[MAX_PATH];
+ GetTempPath(MAX_PATH, tempPath);
+ TCHAR tempName[MAX_PATH];
+ GetTempFileName(tempPath, L"fsd", 0, tempName);
+ _outputPath = tempName;
+
+ (void)SHGetKnownFolderItem(FOLDERID_Documents, KF_FLAG_DEFAULT_PATH, NULL, IID_IShellItem, (void**)&_initFolder);
+ hr = _initFolder->GetDisplayName(SIGDN_NORMALDISPLAY, &pszPath);
+ if (SUCCEEDED(hr))
+ {
+ wcout << L"_outputPath: " << _outputPath << L", _initFolder: " << pszPath << endl;
+ }
+
+#ifdef SYSTEMDIALOG
+ _systemDialog = GetSystemDialog();
+#endif
+}
+
+void CFilesSaveDialog::FinalRelease()
+{
+ if (_systemDialog)
+ {
+ _systemDialog.Release();
+ }
+ if (_initFolder)
+ {
+ _initFolder->Release();
+ }
+ if (_debugStream)
+ {
+ fclose(_debugStream);
+ }
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetSite(IUnknown* pUnkSite)
+{
+ cout << "SetSite" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->SetSite(pUnkSite);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::GetSite(REFIID riid, void** ppvSite)
+{
+ cout << "GetSite" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->GetSite(riid, ppvSite);
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::EnableOpenDropDown(DWORD dwIDCtl)
+{
+ cout << "EnableOpenDropDown" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->EnableOpenDropDown(dwIDCtl);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::AddMenu(DWORD dwIDCtl, LPCWSTR pszLabel)
+{
+ cout << "AddMenu" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->AddMenu(dwIDCtl, pszLabel);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::AddPushButton(DWORD dwIDCtl, LPCWSTR pszLabel)
+{
+ cout << "AddPushButton" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->AddPushButton(dwIDCtl, pszLabel);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::AddComboBox(DWORD dwIDCtl)
+{
+ cout << "AddComboBox" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->AddComboBox(dwIDCtl);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::AddRadioButtonList(DWORD dwIDCtl)
+{
+ cout << "AddRadioButtonList" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->AddRadioButtonList(dwIDCtl);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::AddCheckButton(DWORD dwIDCtl, LPCWSTR pszLabel, BOOL bChecked)
+{
+ cout << "AddCheckButton" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->AddCheckButton(dwIDCtl, pszLabel, bChecked);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::AddEditBox(DWORD dwIDCtl, LPCWSTR pszText)
+{
+ cout << "AddEditBox" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->AddEditBox(dwIDCtl, pszText);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::AddSeparator(DWORD dwIDCtl)
+{
+ cout << "AddSeparator" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->AddSeparator(dwIDCtl);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::AddText(DWORD dwIDCtl, LPCWSTR pszText)
+{
+ cout << "AddText" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->AddText(dwIDCtl, pszText);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetControlLabel(DWORD dwIDCtl, LPCWSTR pszLabel)
+{
+ cout << "SetControlLabel" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->SetControlLabel(dwIDCtl, pszLabel);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::GetControlState(DWORD dwIDCtl, CDCONTROLSTATEF* pdwState)
+{
+ cout << "GetControlState" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->GetControlState(dwIDCtl, pdwState);
+#endif
+ * pdwState = CDCS_ENABLEDVISIBLE;
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetControlState(DWORD dwIDCtl, CDCONTROLSTATEF dwState)
+{
+ cout << "SetControlState" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->SetControlState(dwIDCtl, dwState);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::GetEditBoxText(DWORD dwIDCtl, WCHAR** ppszText)
+{
+ cout << "GetEditBoxText" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->GetEditBoxText(dwIDCtl, ppszText);
+#endif
+ SHStrDupW(L"", ppszText);
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetEditBoxText(DWORD dwIDCtl, LPCWSTR pszText)
+{
+ cout << "SetEditBoxText" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->SetEditBoxText(dwIDCtl, pszText);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::GetCheckButtonState(DWORD dwIDCtl, BOOL* pbChecked)
+{
+ cout << "GetCheckButtonState" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->GetCheckButtonState(dwIDCtl, pbChecked);
+#endif
+ * pbChecked = false;
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetCheckButtonState(DWORD dwIDCtl, BOOL bChecked)
+{
+ cout << "SetCheckButtonState" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->SetCheckButtonState(dwIDCtl, bChecked);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::AddControlItem(DWORD dwIDCtl, DWORD dwIDItem, LPCWSTR pszLabel)
+{
+ cout << "AddControlItem" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->AddControlItem(dwIDCtl, dwIDItem, pszLabel);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::RemoveControlItem(DWORD dwIDCtl, DWORD dwIDItem)
+{
+ cout << "RemoveControlItem" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->RemoveControlItem(dwIDCtl, dwIDItem);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::RemoveAllControlItems(DWORD dwIDCtl)
+{
+ cout << "RemoveAllControlItems" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->RemoveAllControlItems(dwIDCtl);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::GetControlItemState(DWORD dwIDCtl, DWORD dwIDItem, CDCONTROLSTATEF* pdwState)
+{
+ cout << "GetControlItemState" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->GetControlItemState(dwIDCtl, dwIDItem, pdwState);
+#endif
+ * pdwState = CDCS_ENABLEDVISIBLE;
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetControlItemState(DWORD dwIDCtl, DWORD dwIDItem, CDCONTROLSTATEF dwState)
+{
+ cout << "SetControlItemState" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->SetControlItemState(dwIDCtl, dwIDItem, dwState);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::GetSelectedControlItem(DWORD dwIDCtl, DWORD* pdwIDItem)
+{
+ cout << "GetSelectedControlItem" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->GetSelectedControlItem(dwIDCtl, pdwIDItem);
+#endif
+ * pdwIDItem = 0;
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetSelectedControlItem(DWORD dwIDCtl, DWORD dwIDItem)
+{
+ cout << "SetSelectedControlItem" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->SetSelectedControlItem(dwIDCtl, dwIDItem);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::StartVisualGroup(DWORD dwIDCtl, LPCWSTR pszLabel)
+{
+ cout << "StartVisualGroup" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->StartVisualGroup(dwIDCtl, pszLabel);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::EndVisualGroup(void)
+{
+ cout << "EndVisualGroup" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->EndVisualGroup();
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::MakeProminent(DWORD dwIDCtl)
+{
+ cout << "MakeProminent" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->MakeProminent(dwIDCtl);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetControlItemText(DWORD dwIDCtl, DWORD dwIDItem, LPCWSTR pszLabel)
+{
+ cout << "SetControlItemText" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->SetControlItemText(dwIDCtl, dwIDItem, pszLabel);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::Show(HWND hwndOwner)
+{
+ wchar_t wnd_title[1024];
+ GetWindowText(hwndOwner, wnd_title, 1024);
+ wcout << L"Show, hwndOwner: " << wnd_title << endl;
+
+#ifdef SYSTEMDIALOG
+ HRESULT res = _systemDialog->Show(NULL);
+ cout << "Show, DONE: " << res << endl;
+ return res;
+#endif
+
+ SHELLEXECUTEINFO ShExecInfo = { 0 };
+ ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
+ ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
+ ShExecInfo.lpFile = L"files.exe";
+ PWSTR pszPath = NULL;
+ if (_initFolder && SUCCEEDED(_initFolder->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, &pszPath)))
+ {
+ TCHAR args[1024];
+ if (!_initName.empty())
+ {
+ wsprintf(args, L"-directory \"%s\" -outputpath \"%s\" -select \"%s\"", pszPath, _outputPath.c_str(), _initName.c_str());
+ }
+ else
+ {
+ wsprintf(args, L"-directory \"%s\" -outputpath \"%s\"", pszPath, _outputPath.c_str());
+ }
+ wcout << L"Invoking: " << args << endl;
+ ShExecInfo.lpParameters = args;
+ CoTaskMemFree(pszPath);
+ }
+ ShExecInfo.nShow = SW_SHOW;
+ ShellExecuteEx(&ShExecInfo);
+ if (ShExecInfo.hProcess)
+ {
+ WaitForSingleObject(ShExecInfo.hProcess, INFINITE);
+ CloseHandle(ShExecInfo.hProcess);
+ }
+
+ if (hwndOwner)
+ {
+ SetForegroundWindow(hwndOwner);
+ }
+
+ std::ifstream file(_outputPath);
+ if (file.good())
+ {
+ std::string str;
+ std::wstring_convert> converter;
+ while (std::getline(file, str))
+ {
+ std::wstring wide = converter.from_bytes(str);
+ _selectedItem = wide;
+ }
+ }
+ DeleteFile(_outputPath.c_str());
+
+ if (!_selectedItem.empty())
+ {
+ // Create destination file if not existing
+ HANDLE hFile = CreateFile(_selectedItem.c_str(), GENERIC_WRITE, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
+ if (hFile != INVALID_HANDLE_VALUE)
+ {
+ CloseHandle(hFile);
+ }
+ else
+ {
+ _selectedItem = L"";
+ }
+ }
+ if (!_selectedItem.empty())
+ {
+ if (_dialogEvents && std::wstring(wnd_title).find(L"Visual Studio") == std::string::npos)
+ {
+ _dialogEvents->OnFileOk(this);
+ }
+ }
+
+ return !_selectedItem.empty() ? S_OK : HRESULT_FROM_WIN32(ERROR_CANCELLED);
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetFileTypes(UINT cFileTypes, const COMDLG_FILTERSPEC* rgFilterSpec)
+{
+ cout << "SetFileTypes, cFileTypes: " << cFileTypes << endl;
+#ifdef SYSTEMDIALOG
+ return _systemDialog->SetFileTypes(cFileTypes, rgFilterSpec);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetFileTypeIndex(UINT iFileType)
+{
+ cout << "SetFileTypeIndex, iFileType: " << iFileType << endl;
+#ifdef SYSTEMDIALOG
+ return _systemDialog->SetFileTypeIndex(iFileType);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::GetFileTypeIndex(UINT* piFileType)
+{
+ cout << "GetFileTypeIndex" << endl;
+#ifdef SYSTEMDIALOG
+ return _systemDialog->GetFileTypeIndex(piFileType);
+#endif
+ * piFileType = 1;
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::Advise(IFileDialogEvents* pfde, DWORD* pdwCookie)
+{
+ cout << "Advise" << endl;
+#ifdef DEBUGLOG
+ pfde = new FilesDialogEvents(pfde, this);
+#endif
+#ifdef SYSTEMDIALOG
+ return _systemDialog->Advise(pfde, pdwCookie);
+#endif
+ _dialogEvents = pfde;
+ *pdwCookie = 4;
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::Unadvise(DWORD dwCookie)
+{
+ cout << "Unadvise, dwCookie: " << dwCookie << endl;
+#ifdef SYSTEMDIALOG
+ return _systemDialog->Unadvise(dwCookie);
+#endif
+ _dialogEvents = NULL;
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetOptions(FILEOPENDIALOGOPTIONS fos)
+{
+ cout << "SetOptions, fos: " << fos << endl;
+#ifdef SYSTEMDIALOG
+ return _systemDialog->SetOptions(fos);
+#endif
+ _fos = fos;
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::GetOptions(FILEOPENDIALOGOPTIONS* pfos)
+{
+ cout << "GetOptions, fos: " << _fos << endl;
+#ifdef SYSTEMDIALOG
+ return _systemDialog->GetOptions(pfos);
+#endif
+ * pfos = _fos;
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetDefaultFolder(IShellItem* psi)
+{
+ PWSTR pszPath = NULL;
+ if (SUCCEEDED(psi->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, &pszPath)))
+ {
+ wcout << L"SetDefaultFolder, psi: " << pszPath << endl;
+ CoTaskMemFree(pszPath);
+ }
+#ifdef SYSTEMDIALOG
+ return _systemDialog->SetDefaultFolder(psi);
+#endif
+ if (_initFolder)
+ {
+ _initFolder->Release();
+ }
+ _initFolder = CloneShellItem(psi);
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetFolder(IShellItem* psi)
+{
+ PWSTR pszPath = NULL;
+ if (SUCCEEDED(psi->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, &pszPath)))
+ {
+ wcout << L"SetFolder, psi: " << pszPath << endl;
+ CoTaskMemFree(pszPath);
+ }
+#ifdef SYSTEMDIALOG
+ return _systemDialog->SetFolder(psi);
+#endif
+ if (_initFolder)
+ {
+ _initFolder->Release();
+ }
+ _initFolder = CloneShellItem(psi);
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::GetFolder(IShellItem** ppsi)
+{
+ cout << "GetFolder" << endl;
+#ifdef SYSTEMDIALOG
+ return _systemDialog->GetFolder(ppsi);
+#endif
+ * ppsi = NULL;
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::GetCurrentSelection(IShellItem** ppsi)
+{
+ cout << "GetCurrentSelection" << endl;
+#ifdef SYSTEMDIALOG
+ return _systemDialog->GetCurrentSelection(ppsi);
+#endif
+ return GetResult(ppsi);
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetFileName(LPCWSTR pszName)
+{
+ wcout << L"SetFileName, pszName: " << pszName << endl;
+#ifdef SYSTEMDIALOG
+ return _systemDialog->SetFileName(pszName);
+#endif
+ std::wstring absPath = std::wstring(pszName);
+ _initName = absPath.substr(absPath.find_last_of(L"/\\") + 1);
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::GetFileName(LPWSTR* pszName)
+{
+ cout << "GetFileName" << endl;
+#ifdef SYSTEMDIALOG
+ return _systemDialog->GetFileName(pszName);
+#endif
+ SHStrDupW(L"", pszName);
+ if (!_selectedItem.empty())
+ {
+ SHStrDupW(_selectedItem.c_str(), pszName);
+ }
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetTitle(LPCWSTR pszTitle)
+{
+ wcout << L"SetTitle, title: " << pszTitle << endl;
+#ifdef SYSTEMDIALOG
+ return _systemDialog->SetTitle(pszTitle);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetOkButtonLabel(LPCWSTR pszText)
+{
+ wcout << L"SetOkButtonLabel, pszText: " << pszText << endl;
+#ifdef SYSTEMDIALOG
+ return _systemDialog->SetOkButtonLabel(pszText);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetFileNameLabel(LPCWSTR pszLabel)
+{
+ wcout << L"SetFileNameLabel, pszLabel: " << pszLabel << endl;
+#ifdef SYSTEMDIALOG
+ return _systemDialog->SetFileNameLabel(pszLabel);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::GetResult(IShellItem** ppsi)
+{
+ cout << "GetResult" << endl;
+#ifdef SYSTEMDIALOG
+ return _systemDialog->GetResult(ppsi);
+#endif
+ if (!_selectedItem.empty())
+ {
+ SHCreateItemFromParsingName(_selectedItem.c_str(), NULL, IID_IShellItem, (void**)ppsi);
+ return S_OK;
+ }
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::AddPlace(IShellItem* psi, FDAP fdap)
+{
+ PWSTR pszPath = NULL;
+ if (SUCCEEDED(psi->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, &pszPath)))
+ {
+ wcout << L"AddPlace, psi: " << pszPath << endl;
+ CoTaskMemFree(pszPath);
+ }
+#ifdef SYSTEMDIALOG
+ return _systemDialog->AddPlace(psi, fdap);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetDefaultExtension(LPCWSTR pszDefaultExtension)
+{
+ wcout << L"SetDefaultExtension, pszDefaultExtension: " << pszDefaultExtension << endl;
+#ifdef SYSTEMDIALOG
+ return _systemDialog->SetDefaultExtension(pszDefaultExtension);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::Close(HRESULT hr)
+{
+ cout << "Close, hr: " << hr << endl;
+#ifdef SYSTEMDIALOG
+ return _systemDialog->Close(hr);
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetClientGuid(REFGUID guid)
+{
+ cout << "SetClientGuid" << endl;
+#ifdef SYSTEMDIALOG
+ return _systemDialog->SetClientGuid(guid);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::ClearClientData(void)
+{
+ cout << "ClearClientData" << endl;
+#ifdef SYSTEMDIALOG
+ return _systemDialog->ClearClientData();
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetFilter(IShellItemFilter* pFilter)
+{
+ cout << "SetFilter" << endl;
+#ifdef SYSTEMDIALOG
+ return _systemDialog->SetFilter(pFilter);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetCancelButtonLabel(LPCWSTR pszLabel)
+{
+ cout << "SetCancelButtonLabel" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->SetCancelButtonLabel(pszLabel);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetNavigationRoot(IShellItem* psi)
+{
+ cout << "SetNavigationRoot" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->SetNavigationRoot(psi);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::HideControlsForHostedPickerProviderApp(void)
+{
+ cout << "HideControlsForHostedPickerProviderApp" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->HideControlsForHostedPickerProviderApp();
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::EnableControlsForHostedPickerProviderApp(void)
+{
+ cout << "EnableControlsForHostedPickerProviderApp" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->EnableControlsForHostedPickerProviderApp();
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::GetPrivateOptions(unsigned long* pfos)
+{
+ cout << "GetPrivateOptions" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->GetPrivateOptions(pfos);
+#endif
+ * pfos = 0;
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetPrivateOptions(unsigned long fos)
+{
+ cout << "SetPrivateOptions" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->SetPrivateOptions(fos);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetPersistenceKey(unsigned short const* pkey)
+{
+ cout << "SetPersistenceKey" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->SetPersistenceKey(pkey);
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::HasPlaces(void)
+{
+ cout << "HasPlaces" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->HasPlaces();
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::EnumPlaces(int plc, _GUID const& riid, void** ppv)
+{
+ cout << "EnumPlaces" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->EnumPlaces(plc, riid, ppv);
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::EnumControls(void** ppv)
+{
+ cout << "EnumControls" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->EnumControls(ppv);
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::GetPersistRegkey(unsigned short** preg)
+{
+ cout << "GetPersistRegkey" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->GetPersistRegkey(preg);
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::GetSavePropertyStore(IPropertyStore** ppstore, IPropertyDescriptionList** ppdesclist)
+{
+ cout << "GetSavePropertyStore" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->GetSavePropertyStore(ppstore, ppdesclist);
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::GetSaveExtension(unsigned short** pext)
+{
+ cout << "GetSaveExtension" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->GetSaveExtension(pext);
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::GetFileTypeControl(void** ftp)
+{
+ cout << "GetFileTypeControl" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->GetFileTypeControl(ftp);
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::GetFileNameControl(void** pctrl)
+{
+ cout << "GetFileNameControl" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->GetFileNameControl(pctrl);
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::GetFileProtectionControl(void** pfctrl)
+{
+ cout << "GetFileProtectionControl" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->GetFileProtectionControl(pfctrl);
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetFolderPrivate(IShellItem* psi, int arg)
+{
+ cout << "SetFolderPrivate" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->SetFolderPrivate(psi, arg);
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetCustomControlAreaHeight(unsigned int height)
+{
+ cout << "SetCustomControlAreaHeight" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->SetCustomControlAreaHeight(height);
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::GetDialogState(unsigned long arg, unsigned long* pstate)
+{
+ cout << "GetDialogState" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->GetDialogState(arg, pstate);
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetAppControlsModule(void* papp)
+{
+ cout << "SetAppControlsModule" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->SetAppControlsModule(papp);
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetUserEditedSaveProperties(void)
+{
+ cout << "SetUserEditedSaveProperties" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->SetUserEditedSaveProperties();
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::ShouldShowStandardNavigationRoots(void)
+{
+ cout << "ShouldShowStandardNavigationRoots" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->ShouldShowStandardNavigationRoots();
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::GetNavigationRoot(_GUID const& riid, void** ppv)
+{
+ cout << "GetNavigationRoot" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->GetNavigationRoot(riid, ppv);
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::ShouldShowFileProtectionControl(int* pfpc)
+{
+ cout << "ShouldShowFileProtectionControl" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->ShouldShowFileProtectionControl(pfpc);
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::GetCurrentDialogView(_GUID const& riid, void** ppv)
+{
+ cout << "GetCurrentDialogView" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->GetCurrentDialogView(riid, ppv);
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetSaveDialogEditBoxTextAndFileType(int arg, unsigned short const* pargb)
+{
+ cout << "SetSaveDialogEditBoxTextAndFileType" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->SetSaveDialogEditBoxTextAndFileType(arg, pargb);
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::MoveFocusFromBrowser(int arg)
+{
+ cout << "MoveFocusFromBrowser" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->MoveFocusFromBrowser(arg);
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::EnableOkButton(int enbl)
+{
+ cout << "EnableOkButton" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->EnableOkButton(enbl);
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::InitEnterpriseId(unsigned short const* pid)
+{
+ cout << "InitEnterpriseId" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->InitEnterpriseId(pid);
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::AdviseFirst(IFileDialogEvents* pfde, unsigned long* pdwCookie)
+{
+ cout << "AdviseFirst" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->AdviseFirst(pfde, pdwCookie);
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::HandleTab(void)
+{
+ cout << "HandleTab" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->HandleTab();
+#endif
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetSaveAsItem(IShellItem* psi)
+{
+ PWSTR pszPath = NULL;
+ if (SUCCEEDED(psi->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, &pszPath)))
+ {
+ wcout << L"SetSaveAsItem, psi: " << pszPath << endl;
+ CoTaskMemFree(pszPath);
+ }
+#ifdef SYSTEMDIALOG
+ return _systemDialog->SetSaveAsItem(psi);
+#endif
+ if (_initFolder)
+ {
+ _initFolder->Release();
+ }
+ psi->GetParent(&_initFolder);
+ if (SUCCEEDED(psi->GetDisplayName(SIGDN_NORMALDISPLAY, &pszPath)))
+ {
+ _initName = pszPath;
+ }
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetProperties(IPropertyStore* pStore)
+{
+ cout << "SetProperties" << endl;
+#ifdef SYSTEMDIALOG
+ return _systemDialog->SetProperties(pStore);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::SetCollectedProperties(IPropertyDescriptionList* pList, BOOL fAppendDefault)
+{
+ cout << "SetCollectedProperties" << endl;
+#ifdef SYSTEMDIALOG
+ return _systemDialog->SetCollectedProperties(pList, fAppendDefault);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::GetProperties(IPropertyStore** ppStore)
+{
+ cout << "GetProperties" << endl;
+#ifdef SYSTEMDIALOG
+ return _systemDialog->GetProperties(ppStore);
+#endif
+ * ppStore = 0;
+ return E_NOTIMPL;
+}
+
+HRESULT __stdcall CFilesSaveDialog::ApplyProperties(IShellItem* psi, IPropertyStore* pStore, HWND hwnd, IFileOperationProgressSink* pSink)
+{
+ cout << "ApplyProperties" << endl;
+#ifdef SYSTEMDIALOG
+ return _systemDialog->ApplyProperties(psi, pStore, hwnd, pSink);
+#endif
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::GetWindow(HWND* phwnd)
+{
+ cout << "GetWindow" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->GetWindow(phwnd);
+#endif
+ * phwnd = NULL;
+ return S_OK;
+}
+
+HRESULT __stdcall CFilesSaveDialog::ContextSensitiveHelp(BOOL fEnterMode)
+{
+ cout << "ContextSensitiveHelp" << endl;
+#ifdef SYSTEMDIALOG
+ return AsInterface(_systemDialog)->ContextSensitiveHelp(fEnterMode);
+#endif
+ return S_OK;
+}
diff --git a/src/Files.OpenDialog/CustomSaveDialog/FilesSaveDialog.h b/src/Files.OpenDialog/CustomSaveDialog/FilesSaveDialog.h
new file mode 100644
index 000000000000..3f6f148eaa27
--- /dev/null
+++ b/src/Files.OpenDialog/CustomSaveDialog/FilesSaveDialog.h
@@ -0,0 +1,271 @@
+// FilesSaveDialog.h: dichiarazione di CFilesSaveDialog
+
+#pragma once
+#include "resource.h" // simboli principali
+
+
+//#define DEBUGLOG
+
+
+#include "CustomSaveDialog_i.h"
+#include "UndefInterfaces.h"
+#include
+#include
+#include
+
+
+#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
+#error "Gli oggetti COM a thread singolo non sono supportati correttamente sulla piattaforma Windows CE, ad esempio le piattaforme Windows Mobile non includono un supporto DCOM completo. Definire _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA per fare in modo che ATL supporti la creazione di oggetti COM a thread singolo e consenta l'utilizzo di implementazioni con oggetti COM a thread singolo. Il modello di threading nel file RGS è stato impostato su 'Free' poiché è l'unico modello di threading supportato sulle piattaforme Windows CE non DCOM."
+#endif
+
+using namespace ATL;
+
+
+// CFilesSaveDialog
+
+class ATL_NO_VTABLE CFilesSaveDialog :
+ public CComObjectRootEx,
+ public CComCoClass,
+ public IFileDialog,
+ public IFileDialog2,
+ public IFileSaveDialog,
+ public IFileDialogCustomize,
+ public IObjectWithSite,
+ public IFileDialogPrivate,
+ public IOleWindow
+{
+public:
+ CFilesSaveDialog();
+
+DECLARE_REGISTRY_RESOURCEID(106)
+
+CUSTOM_BEGIN_COM_MAP(CFilesSaveDialog)
+ COM_INTERFACE_ENTRY(IFileDialog)
+ COM_INTERFACE_ENTRY(IFileDialog2)
+ COM_INTERFACE_ENTRY(IFileSaveDialog)
+ COM_INTERFACE_ENTRY(IFileDialogCustomize)
+ COM_INTERFACE_ENTRY(IObjectWithSite)
+ COM_INTERFACE_ENTRY(IFileDialogPrivate)
+ COM_INTERFACE_ENTRY(IOleWindow)
+END_COM_MAP()
+
+ DECLARE_PROTECT_FINAL_CONSTRUCT()
+
+ HRESULT FinalConstruct()
+ {
+ return S_OK;
+ }
+
+ void FinalRelease();
+
+ CComPtr _systemDialog;
+
+ FILEOPENDIALOGOPTIONS _fos;
+
+ std::wstring _selectedItem;
+ std::wstring _outputPath;
+ std::wstring _initName;
+ IShellItem* _initFolder;
+ IFileDialogEvents* _dialogEvents;
+
+ FILE* _debugStream;
+
+public:
+ // Ereditato tramite IObjectWithSite
+ HRESULT __stdcall SetSite(IUnknown* pUnkSite) override;
+
+ HRESULT __stdcall GetSite(REFIID riid, void** ppvSite) override;
+
+
+ // Ereditato tramite IFileDialogCustomize
+ HRESULT __stdcall EnableOpenDropDown(DWORD dwIDCtl) override;
+
+ HRESULT __stdcall AddMenu(DWORD dwIDCtl, LPCWSTR pszLabel) override;
+
+ HRESULT __stdcall AddPushButton(DWORD dwIDCtl, LPCWSTR pszLabel) override;
+
+ HRESULT __stdcall AddComboBox(DWORD dwIDCtl) override;
+
+ HRESULT __stdcall AddRadioButtonList(DWORD dwIDCtl) override;
+
+ HRESULT __stdcall AddCheckButton(DWORD dwIDCtl, LPCWSTR pszLabel, BOOL bChecked) override;
+
+ HRESULT __stdcall AddEditBox(DWORD dwIDCtl, LPCWSTR pszText) override;
+
+ HRESULT __stdcall AddSeparator(DWORD dwIDCtl) override;
+
+ HRESULT __stdcall AddText(DWORD dwIDCtl, LPCWSTR pszText) override;
+
+ HRESULT __stdcall SetControlLabel(DWORD dwIDCtl, LPCWSTR pszLabel) override;
+
+ HRESULT __stdcall GetControlState(DWORD dwIDCtl, CDCONTROLSTATEF* pdwState) override;
+
+ HRESULT __stdcall SetControlState(DWORD dwIDCtl, CDCONTROLSTATEF dwState) override;
+
+ HRESULT __stdcall GetEditBoxText(DWORD dwIDCtl, WCHAR** ppszText) override;
+
+ HRESULT __stdcall SetEditBoxText(DWORD dwIDCtl, LPCWSTR pszText) override;
+
+ HRESULT __stdcall GetCheckButtonState(DWORD dwIDCtl, BOOL* pbChecked) override;
+
+ HRESULT __stdcall SetCheckButtonState(DWORD dwIDCtl, BOOL bChecked) override;
+
+ HRESULT __stdcall AddControlItem(DWORD dwIDCtl, DWORD dwIDItem, LPCWSTR pszLabel) override;
+
+ HRESULT __stdcall RemoveControlItem(DWORD dwIDCtl, DWORD dwIDItem) override;
+
+ HRESULT __stdcall RemoveAllControlItems(DWORD dwIDCtl) override;
+
+ HRESULT __stdcall GetControlItemState(DWORD dwIDCtl, DWORD dwIDItem, CDCONTROLSTATEF* pdwState) override;
+
+ HRESULT __stdcall SetControlItemState(DWORD dwIDCtl, DWORD dwIDItem, CDCONTROLSTATEF dwState) override;
+
+ HRESULT __stdcall GetSelectedControlItem(DWORD dwIDCtl, DWORD* pdwIDItem) override;
+
+ HRESULT __stdcall SetSelectedControlItem(DWORD dwIDCtl, DWORD dwIDItem) override;
+
+ HRESULT __stdcall StartVisualGroup(DWORD dwIDCtl, LPCWSTR pszLabel) override;
+
+ HRESULT __stdcall EndVisualGroup(void) override;
+
+ HRESULT __stdcall MakeProminent(DWORD dwIDCtl) override;
+
+ HRESULT __stdcall SetControlItemText(DWORD dwIDCtl, DWORD dwIDItem, LPCWSTR pszLabel) override;
+
+
+ // Ereditato tramite IFileDialog
+ HRESULT __stdcall Show(HWND hwndOwner) override;
+
+ HRESULT __stdcall SetFileTypes(UINT cFileTypes, const COMDLG_FILTERSPEC* rgFilterSpec) override;
+
+ HRESULT __stdcall SetFileTypeIndex(UINT iFileType) override;
+
+ HRESULT __stdcall GetFileTypeIndex(UINT* piFileType) override;
+
+ HRESULT __stdcall Advise(IFileDialogEvents* pfde, DWORD* pdwCookie) override;
+
+ HRESULT __stdcall Unadvise(DWORD dwCookie) override;
+
+ HRESULT __stdcall SetOptions(FILEOPENDIALOGOPTIONS fos) override;
+
+ HRESULT __stdcall GetOptions(FILEOPENDIALOGOPTIONS* pfos) override;
+
+ HRESULT __stdcall SetDefaultFolder(IShellItem* psi) override;
+
+ HRESULT __stdcall SetFolder(IShellItem* psi) override;
+
+ HRESULT __stdcall GetFolder(IShellItem** ppsi) override;
+
+ HRESULT __stdcall GetCurrentSelection(IShellItem** ppsi) override;
+
+ HRESULT __stdcall SetFileName(LPCWSTR pszName) override;
+
+ HRESULT __stdcall GetFileName(LPWSTR* pszName) override;
+
+ HRESULT __stdcall SetTitle(LPCWSTR pszTitle) override;
+
+ HRESULT __stdcall SetOkButtonLabel(LPCWSTR pszText) override;
+
+ HRESULT __stdcall SetFileNameLabel(LPCWSTR pszLabel) override;
+
+ HRESULT __stdcall GetResult(IShellItem** ppsi) override;
+
+ HRESULT __stdcall AddPlace(IShellItem* psi, FDAP fdap) override;
+
+ HRESULT __stdcall SetDefaultExtension(LPCWSTR pszDefaultExtension) override;
+
+ HRESULT __stdcall Close(HRESULT hr) override;
+
+ HRESULT __stdcall SetClientGuid(REFGUID guid) override;
+
+ HRESULT __stdcall ClearClientData(void) override;
+
+ HRESULT __stdcall SetFilter(IShellItemFilter* pFilter) override;
+
+
+ // Ereditato tramite IFileDialog2
+ HRESULT __stdcall SetCancelButtonLabel(LPCWSTR pszLabel) override;
+
+ HRESULT __stdcall SetNavigationRoot(IShellItem* psi) override;
+
+
+ // Ereditato tramite IFileDialogPrivate
+ HRESULT __stdcall HideControlsForHostedPickerProviderApp(void) override;
+
+ HRESULT __stdcall EnableControlsForHostedPickerProviderApp(void) override;
+
+ HRESULT __stdcall GetPrivateOptions(unsigned long*) override;
+
+ HRESULT __stdcall SetPrivateOptions(unsigned long) override;
+
+ HRESULT __stdcall SetPersistenceKey(unsigned short const*) override;
+
+ HRESULT __stdcall HasPlaces(void) override;
+
+ HRESULT __stdcall EnumPlaces(int, _GUID const&, void**) override;
+
+ HRESULT __stdcall EnumControls(void**) override;
+
+ HRESULT __stdcall GetPersistRegkey(unsigned short**) override;
+
+ HRESULT __stdcall GetSavePropertyStore(IPropertyStore**, IPropertyDescriptionList**) override;
+
+ HRESULT __stdcall GetSaveExtension(unsigned short**) override;
+
+ HRESULT __stdcall GetFileTypeControl(void**) override;
+
+ HRESULT __stdcall GetFileNameControl(void**) override;
+
+ HRESULT __stdcall GetFileProtectionControl(void**) override;
+
+ HRESULT __stdcall SetFolderPrivate(IShellItem*, int) override;
+
+ HRESULT __stdcall SetCustomControlAreaHeight(unsigned int) override;
+
+ HRESULT __stdcall GetDialogState(unsigned long, unsigned long*) override;
+
+ HRESULT __stdcall SetAppControlsModule(void*) override;
+
+ HRESULT __stdcall SetUserEditedSaveProperties(void) override;
+
+ HRESULT __stdcall ShouldShowStandardNavigationRoots(void) override;
+
+ HRESULT __stdcall GetNavigationRoot(_GUID const&, void**) override;
+
+ HRESULT __stdcall ShouldShowFileProtectionControl(int*) override;
+
+ HRESULT __stdcall GetCurrentDialogView(_GUID const&, void**) override;
+
+ HRESULT __stdcall SetSaveDialogEditBoxTextAndFileType(int, unsigned short const*) override;
+
+ HRESULT __stdcall MoveFocusFromBrowser(int) override;
+
+ HRESULT __stdcall EnableOkButton(int) override;
+
+ HRESULT __stdcall InitEnterpriseId(unsigned short const*) override;
+
+ HRESULT __stdcall AdviseFirst(IFileDialogEvents*, unsigned long*) override;
+
+ HRESULT __stdcall HandleTab(void) override;
+
+
+ // Ereditato tramite IFileSaveDialog
+ HRESULT __stdcall SetSaveAsItem(IShellItem* psi) override;
+
+ HRESULT __stdcall SetProperties(IPropertyStore* pStore) override;
+
+ HRESULT __stdcall SetCollectedProperties(IPropertyDescriptionList* pList, BOOL fAppendDefault) override;
+
+ HRESULT __stdcall GetProperties(IPropertyStore** ppStore) override;
+
+ HRESULT __stdcall ApplyProperties(IShellItem* psi, IPropertyStore* pStore, HWND hwnd, IFileOperationProgressSink* pSink) override;
+
+
+ // Ereditato tramite IOleWindow
+ virtual HRESULT __stdcall GetWindow(HWND* phwnd) override;
+
+ virtual HRESULT __stdcall ContextSensitiveHelp(BOOL fEnterMode) override;
+
+};
+
+OBJECT_ENTRY_AUTO(__uuidof(FilesSaveDialog), CFilesSaveDialog)
diff --git a/src/Files.OpenDialog/CustomSaveDialog/FilesSaveDialog.rgs b/src/Files.OpenDialog/CustomSaveDialog/FilesSaveDialog.rgs
new file mode 100644
index 000000000000..fc0a4b6e4351
--- /dev/null
+++ b/src/Files.OpenDialog/CustomSaveDialog/FilesSaveDialog.rgs
@@ -0,0 +1,16 @@
+HKCR
+{
+ NoRemove CLSID
+ {
+ ForceRemove {C0B4E2F3-BA21-4773-8DBA-335EC946EB8B} = s 'FilesSaveDialog class'
+ {
+ ForceRemove Programmable
+ InprocServer32 = s '%MODULE%'
+ {
+ val ThreadingModel = s 'Apartment'
+ }
+ TypeLib = s '{21533617-c1cd-4d33-a190-21fb069b55f4}'
+ Version = s '1.0'
+ }
+ }
+}
diff --git a/src/Files.OpenDialog/CustomSaveDialog/UndefInterfaces.h b/src/Files.OpenDialog/CustomSaveDialog/UndefInterfaces.h
new file mode 100644
index 000000000000..75dba8b174cd
--- /dev/null
+++ b/src/Files.OpenDialog/CustomSaveDialog/UndefInterfaces.h
@@ -0,0 +1,89 @@
+// UndefInterfaces.h: undocumented interfaces declarations & helpers
+
+#pragma once
+
+
+#include "framework.h"
+#include "shobjidl.h"
+
+
+using namespace ATL;
+
+
+#ifdef DEBUGLOG
+
+#define CUSTOM_BEGIN_COM_MAP(x) public: \
+ typedef x _ComMapClass; \
+ static HRESULT WINAPI _Cache(_In_ void* pv, _In_ REFIID iid, _COM_Outptr_result_maybenull_ void** ppvObject, _In_ DWORD_PTR dw) throw()\
+ {\
+ _ComMapClass* p = (_ComMapClass*)pv;\
+ p->Lock();\
+ HRESULT hRes = E_FAIL; \
+ __try \
+ { \
+ hRes = ATL::CComObjectRootBase::_Cache(pv, iid, ppvObject, dw);\
+ } \
+ __finally \
+ { \
+ p->Unlock();\
+ } \
+ return hRes;\
+ }\
+ IUnknown* _GetRawUnknown() throw() \
+ { ATLASSERT(_GetEntries()[0].pFunc == _ATL_SIMPLEMAPENTRY); return (IUnknown*)((INT_PTR)this+_GetEntries()->dw); } \
+ _ATL_DECLARE_GET_UNKNOWN(x)\
+ HRESULT _InternalQueryInterface( \
+ _In_ REFIID iid, \
+ _COM_Outptr_ void** ppvObject) throw() \
+ { \
+ HRESULT res = this->InternalQueryInterface(this, _GetEntries(), iid, ppvObject); \
+ OLECHAR* guidString; \
+ (void)StringFromCLSID(iid, &guidString); \
+ std::wcout << L"QueryInterface: " << guidString << L" = " << res << std::endl; \
+ ::CoTaskMemFree(guidString); \
+ return res; \
+ } \
+ const static ATL::_ATL_INTMAP_ENTRY* WINAPI _GetEntries() throw() { \
+ static const ATL::_ATL_INTMAP_ENTRY _entries[] = { DEBUG_QI_ENTRY(x)
+
+#else
+
+#define CUSTOM_BEGIN_COM_MAP(x) BEGIN_COM_MAP(x)
+
+#endif // DEBUGLOG
+
+
+MIDL_INTERFACE("9EA5491C-89C8-4BEF-93D3-7F665FB82A33")
+IFileDialogPrivate : public IUnknown
+{
+public:
+ virtual HRESULT STDMETHODCALLTYPE HideControlsForHostedPickerProviderApp(void) = 0;
+ virtual HRESULT STDMETHODCALLTYPE EnableControlsForHostedPickerProviderApp(void) = 0;
+ virtual HRESULT STDMETHODCALLTYPE GetPrivateOptions(unsigned long*) = 0;
+ virtual HRESULT STDMETHODCALLTYPE SetPrivateOptions(unsigned long) = 0;
+ virtual HRESULT STDMETHODCALLTYPE SetPersistenceKey(unsigned short const*) = 0;
+ virtual HRESULT STDMETHODCALLTYPE HasPlaces(void) = 0;
+ virtual HRESULT STDMETHODCALLTYPE EnumPlaces(int, _GUID const&, void**) = 0;//tagFDPEPLACES
+ virtual HRESULT STDMETHODCALLTYPE EnumControls(void**) = 0;//IEnumAppControl
+ virtual HRESULT STDMETHODCALLTYPE GetPersistRegkey(unsigned short**) = 0;
+ virtual HRESULT STDMETHODCALLTYPE GetSavePropertyStore(IPropertyStore**, IPropertyDescriptionList**) = 0;
+ virtual HRESULT STDMETHODCALLTYPE GetSaveExtension(unsigned short**) = 0;
+ virtual HRESULT STDMETHODCALLTYPE GetFileTypeControl(void**) = 0;//IAppControl
+ virtual HRESULT STDMETHODCALLTYPE GetFileNameControl(void**) = 0;//IAppControl
+ virtual HRESULT STDMETHODCALLTYPE GetFileProtectionControl(void**) = 0;//IAppControl
+ virtual HRESULT STDMETHODCALLTYPE SetFolderPrivate(IShellItem*, int) = 0;
+ virtual HRESULT STDMETHODCALLTYPE SetCustomControlAreaHeight(unsigned int) = 0;
+ virtual HRESULT STDMETHODCALLTYPE GetDialogState(unsigned long, unsigned long*) = 0;
+ virtual HRESULT STDMETHODCALLTYPE SetAppControlsModule(void*) = 0;//IAppControlsModule
+ virtual HRESULT STDMETHODCALLTYPE SetUserEditedSaveProperties(void) = 0;
+ virtual HRESULT STDMETHODCALLTYPE ShouldShowStandardNavigationRoots(void) = 0;
+ virtual HRESULT STDMETHODCALLTYPE GetNavigationRoot(_GUID const&, void**) = 0;
+ virtual HRESULT STDMETHODCALLTYPE ShouldShowFileProtectionControl(int*) = 0;
+ virtual HRESULT STDMETHODCALLTYPE GetCurrentDialogView(_GUID const&, void**) = 0;
+ virtual HRESULT STDMETHODCALLTYPE SetSaveDialogEditBoxTextAndFileType(int, unsigned short const*) = 0;
+ virtual HRESULT STDMETHODCALLTYPE MoveFocusFromBrowser(int) = 0;
+ virtual HRESULT STDMETHODCALLTYPE EnableOkButton(int) = 0;
+ virtual HRESULT STDMETHODCALLTYPE InitEnterpriseId(unsigned short const*) = 0;
+ virtual HRESULT STDMETHODCALLTYPE AdviseFirst(IFileDialogEvents*, unsigned long*) = 0;
+ virtual HRESULT STDMETHODCALLTYPE HandleTab(void) = 0;
+};
diff --git a/src/Files.OpenDialog/CustomSaveDialog/dllmain.cpp b/src/Files.OpenDialog/CustomSaveDialog/dllmain.cpp
new file mode 100644
index 000000000000..e3b584168b34
--- /dev/null
+++ b/src/Files.OpenDialog/CustomSaveDialog/dllmain.cpp
@@ -0,0 +1,16 @@
+// dllmain.cpp: implementazione di DllMain.
+
+#include "pch.h"
+#include "framework.h"
+#include "resource.h"
+#include "CustomSaveDialog_i.h"
+#include "dllmain.h"
+
+CCustomSaveDialogModule _AtlModule;
+
+// Punto di ingresso DLL
+extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
+{
+ hInstance;
+ return _AtlModule.DllMain(dwReason, lpReserved);
+}
diff --git a/src/Files.OpenDialog/CustomSaveDialog/dllmain.h b/src/Files.OpenDialog/CustomSaveDialog/dllmain.h
new file mode 100644
index 000000000000..284a990fe6d1
--- /dev/null
+++ b/src/Files.OpenDialog/CustomSaveDialog/dllmain.h
@@ -0,0 +1,10 @@
+// dllmain.h: dichiarazione della classe del modulo.
+
+class CCustomSaveDialogModule : public ATL::CAtlDllModuleT< CCustomSaveDialogModule >
+{
+public :
+ DECLARE_LIBID(LIBID_CustomSaveDialogLib)
+ DECLARE_REGISTRY_APPID_RESOURCEID(IDR_CUSTOMSAVEDIALOG, "{21533617-c1cd-4d33-a190-21fb069b55f4}")
+};
+
+extern class CCustomSaveDialogModule _AtlModule;
diff --git a/src/Files.OpenDialog/CustomSaveDialog/framework.h b/src/Files.OpenDialog/CustomSaveDialog/framework.h
new file mode 100644
index 000000000000..9ac7cffd8ddd
--- /dev/null
+++ b/src/Files.OpenDialog/CustomSaveDialog/framework.h
@@ -0,0 +1,21 @@
+#pragma once
+
+#ifndef STRICT
+#define STRICT
+#endif
+
+#include "targetver.h"
+
+#define _ATL_APARTMENT_THREADED
+
+#define _ATL_NO_AUTOMATIC_NAMESPACE
+
+#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // alcuni costruttori CString saranno espliciti
+
+
+#define ATL_NO_ASSERT_ON_DESTROY_NONEXISTENT_WINDOW
+
+#include "resource.h"
+#include
+#include
+#include
diff --git a/src/Files.OpenDialog/CustomSaveDialog/pch.cpp b/src/Files.OpenDialog/CustomSaveDialog/pch.cpp
new file mode 100644
index 000000000000..69046d3e1dc0
--- /dev/null
+++ b/src/Files.OpenDialog/CustomSaveDialog/pch.cpp
@@ -0,0 +1,5 @@
+// pch.cpp: file di origine corrispondente all'intestazione precompilata
+
+#include "pch.h"
+
+// Quando si usano intestazioni precompilate, questo file è necessario per la riuscita della compilazione.
diff --git a/src/Files.OpenDialog/CustomSaveDialog/pch.h b/src/Files.OpenDialog/CustomSaveDialog/pch.h
new file mode 100644
index 000000000000..aa5d1c5a0950
--- /dev/null
+++ b/src/Files.OpenDialog/CustomSaveDialog/pch.h
@@ -0,0 +1,13 @@
+// pch.h: questo è un file di intestazione precompilata.
+// I file elencati di seguito vengono compilati una sola volta, in modo da migliorare le prestazioni per le compilazioni successive.
+// Questa impostazione influisce anche sulle prestazioni di IntelliSense, incluso il completamento codice e molte altre funzionalità di esplorazione del codice.
+// I file elencati qui vengono però TUTTI ricompilati se uno di essi viene aggiornato da una compilazione all'altra.
+// Non aggiungere qui file soggetti a frequenti aggiornamenti; in caso contrario si perderanno i vantaggi offerti in termini di prestazioni.
+
+#ifndef PCH_H
+#define PCH_H
+
+// aggiungere qui le intestazioni da precompilare
+#include "framework.h"
+
+#endif //PCH_H
diff --git a/src/Files.OpenDialog/CustomSaveDialog/resource.h b/src/Files.OpenDialog/CustomSaveDialog/resource.h
new file mode 100644
index 000000000000..fbb30dbffe4e
--- /dev/null
+++ b/src/Files.OpenDialog/CustomSaveDialog/resource.h
@@ -0,0 +1,18 @@
+//{{NO_DEPENDENCIES}}
+// File di inclusione generato con Microsoft Visual C++.
+// Utilizzato da CustomSaveDialog.rc
+//
+#define IDS_PROJNAME 100
+#define IDR_CUSTOMSAVEDIALOG 101
+#define IDR_FILESSAVEDIALOG 106
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 201
+#define _APS_NEXT_COMMAND_VALUE 32768
+#define _APS_NEXT_CONTROL_VALUE 201
+#define _APS_NEXT_SYMED_VALUE 107
+#endif
+#endif
diff --git a/src/Files.OpenDialog/CustomSaveDialog/targetver.h b/src/Files.OpenDialog/CustomSaveDialog/targetver.h
new file mode 100644
index 000000000000..7672c2eee3bc
--- /dev/null
+++ b/src/Files.OpenDialog/CustomSaveDialog/targetver.h
@@ -0,0 +1,8 @@
+#pragma once
+
+// L'inclusione di SDKDDKVer.h definisce la piattaforma Windows più recente disponibile.
+
+// Se si desidera compilare l'applicazione per una piattaforma Windows precedente, includere WinSDKVer.h e
+// impostare la macro _WIN32_WINNT sulla piattaforma da supportare prima di includere SDKDDKVer.h.
+
+#include
diff --git a/src/Files.Uwp/Views/SettingsPages/Experimental.xaml b/src/Files.Uwp/Views/SettingsPages/Experimental.xaml
index 7c2d0c512cab..cc188df6dc2d 100644
--- a/src/Files.Uwp/Views/SettingsPages/Experimental.xaml
+++ b/src/Files.Uwp/Views/SettingsPages/Experimental.xaml
@@ -113,7 +113,7 @@
+ Visibility="Visible">