Therefore, you need some changes. The s_filter can contain multiple filters and therefore you'll need to write multiple strings into the databloc. Luckily, Choli made a nice function for doing that.
I've edited Matty's code to use WriteMultiStringW and removed the OFN_FILEMUSTEXIST flag because that can't be used on a Save As dialog!
code:
function SaveFileAs(sTitle, sInitialDir){
if (typeof(sTitle) === 'undefined') sTitle = '';
if (typeof(sInitialDir) === 'undefined') sInitialDir = 'C:\\';
var OpenFileName = Interop.Allocate(88);
with (OpenFileName){
WriteDWORD(0, 88); // Dodgy Microsoft, why can't you figure out the size of the struct yourself...
var filter = 'JPEG (*.jpg;*.jpeg)|*.JPEG;*.JPG|All Files (*.*)|*.*||'; // This string will be used to generate an s_filter databloc
var s_filter = Interop.Allocate(512);
WriteMultiStringW(s_filter, filter);
WriteDWORD(12, s_filter.DataPtr);
WriteDWORD(24, 1);
s_file = Interop.Allocate(512);
// s_file.WriteString(0, '*.*');
WriteDWORD(28, s_file.DataPtr);
WriteDWORD(32, 255);
var sTmp = Interop.Allocate((254+1)*2);
WriteDWORD(36, sTmp.DataPtr);
WriteDWORD(40, 255);
var s_initdir = Interop.Allocate((sInitialDir.length+1)*2);
s_initdir.WriteString(0, sInitialDir);
WriteDWORD(44, s_initdir.DataPtr);
s_title = Interop.Allocate((sTitle.length+1)*2);
WriteDWORD(48, s_title.DataPtr);
WriteDWORD(52, 0x800000 /* OFN_ENABLESIZING */ | 0x80000 /* OFN_EXPLORER */ | 0x4 /* OFN_HIDEREADONLY */ | 0x200000 /* OFN_LONGNAMES */ | 0x800 /* OFN_PATHMUSTEXIST */ | 0x1000 /* OFN_OVERWRITEPROMPT */);
}
return Interop.Call('comdlg32', 'GetSaveFileNameW', OpenFileName) !== 0 ? s_file.ReadString(0) : false;
function WriteMultiStringW (datablock, string) {
var pos = 0;
datablock.WriteString(0, string);
pos = string.indexOf("|", pos);
while (pos != -1) {
datablock.WriteWORD(2 * pos, 0);
pos = string.indexOf("|", pos + 1);
}
}
}