Shoutbox

Save File As Dialog - Printable Version

-Shoutbox (https://shoutbox.menthix.net)
+-- Forum: MsgHelp Archive (/forumdisplay.php?fid=58)
+--- Forum: Messenger Plus! for Live Messenger (/forumdisplay.php?fid=4)
+---- Forum: Scripting (/forumdisplay.php?fid=39)
+----- Thread: Save File As Dialog (/showthread.php?tid=76836)

Save File As Dialog by davidpolitis on 08-17-2007 at 12:49 PM

I've been searching MSDN and Google all day and can't seem to find any JScript examples of a save file as dialog, so just wondering if someone can please post some example code for me...

Thanks,
David.


RE: Save File As Dialog by matty on 08-17-2007 at 01:02 PM

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 s_filter = Interop.Allocate(512);
        s_filter.WriteString(0, 'All Files (*.*)');
            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_FILEMUSTEXIST */ | 0x00000002 /* OFN_OVERWRITEPROMPT */);
    }
    return Interop.Call('comdlg32', 'GetSaveFileNameW', OpenFileName) !== 0 ? s_file.ReadString(0) : false;
}


RE: Save File As Dialog by davidpolitis on 08-17-2007 at 01:03 PM

Thanks a million man, you rock (y)

How do I choose the file to be saved? XD

Edit: Found out myself :P

Would you possibly be able to edit the filter, I can't get it to work out. I need it for .jpg and .jpeg :P

Thanks in advance.


RE: Save File As Dialog by Matti on 08-17-2007 at 04:06 PM

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);
        }
    }
}


RE: Save File As Dialog by matty on 08-17-2007 at 04:26 PM

Mattike you should also give props to Choli for the WriteMultiStringW function as he wrote it.


RE: Save File As Dialog by davidpolitis on 08-17-2007 at 10:15 PM

Any of you have any idea why this will not work and get the current display pictures file extension?

code:
function SaveFileAs(sTitle, sInitialDir)
{
    var fso = new ActiveXObject("Scripting.FileSystemObject");
    var file = fso.GetFile(Messenger.MyDisplayPicture);
    var type = file.substr(file.lastIndexOf(".") + 1);
    if (typeof(sTitle) === 'undefined') sTitle = '';
    if (typeof(sInitialDir) === 'undefined') sInitialDir = 'C:\\';
    var OpenFileName = Interop.Allocate(88);

    with (OpenFileName)
    {
        WriteDWORD(0, 88);
        if (type == "jpg") var filter = "jpg-filter-code";
        if (type == "png") var filter = "png-filter-code";
        //var filter = 'JPEG (*.jpg;*.jpeg)|*.JPEG;*.JPG|';
        var s_filter = Interop.Allocate(512);
        WriteMultiStringW(s_filter, filter);
         WriteDWORD(12, s_filter.DataPtr);
        WriteDWORD(24, 1);
        s_file = Interop.Allocate(512);
        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 */);
    }
       file.Copy(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);
        }
      }
}

Sorry about the formatting, if you want go here: http://pastebin.com/d7794d483
RE: Save File As Dialog by Spunky on 08-18-2007 at 08:07 AM

quote:
Originally posted by davidpolitis
Any of you have any idea why this will not work and get the current display pictures file extension?

Isn't it ALWAYS converted to png?
RE: Save File As Dialog by davidpolitis on 08-18-2007 at 12:18 PM

No, well... I tested and MP!L returns the file as being the same file format as the original image file.


RE: Save File As Dialog by MeEtc on 08-18-2007 at 12:33 PM

The file is definitly NOT always png. I had problems trying to get the DP showing in my sig image using CreateImageFromPNG. Well, that function fails if your file is a jpg. took me forever to figure out why


RE: RE: Save File As Dialog by TheSteve on 08-20-2007 at 12:22 AM

quote:
Originally posted by matty
code:
// Dodgy Microsoft, why can't you figure out the size of the struct yourself...

There are different versions of the structure. The size determines which you are using.  For example, if the symbol _MAC is defined, the structure will grow by 8 bytes. If you're using windows 2000 or greater it will grow another 12 bytes.
RE: Save File As Dialog by markee on 08-20-2007 at 03:06 AM

quote:
Originally posted by SpunkyLoveMuff
quote:
Originally posted by davidpolitis
Any of you have any idea why this will not work and get the current display pictures file extension?

Isn't it ALWAYS converted to png?
Your contacts display pictures are always sent to you as .PNG however your personal ones can be .PNG .JPG and .GIF

Cookie talks about it more in CookieRevised's reply to Where does MSN store it's avatars?.
RE: Save File As Dialog by davidpolitis on 08-20-2007 at 11:41 AM

Found that out on my own, I was backing up my display picture as png and Irfanview was saying that the file extension was wrong.

Thanks for the link though markee, might come in handy :P