Menu

#78 zip2exe: checkbox for solid compression

Stable
closed-accepted
5
2015-03-02
2005-10-21
No

nsis-2.10-1-src I have added a checkbox for solid
compression to zip2exe tool.

**************************************************

Base.nsh:

;Change this file to customize zip2exe generated installers

Name "${ZIP2EXE_NAME}"
OutFile "${ZIP2EXE_OUTFILE}"

AllowRootDirInstall true

!ifdef ZIP2EXE_COMPRESSOR_SOLID

!ifdef ZIP2EXE_COMPRESSOR_ZLIB
SetCompressor /SOLID zlib
!else ifdef ZIP2EXE_COMPRESSOR_BZIP2
SetCompressor /SOLID bzip2
!else ifdef ZIP2EXE_COMPRESSOR_LZMA
SetCompressor /SOLID lzma
!endif

!else

!ifdef ZIP2EXE_COMPRESSOR_ZLIB
SetCompressor zlib
!else ifdef ZIP2EXE_COMPRESSOR_BZIP2
SetCompressor bzip2
!else ifdef ZIP2EXE_COMPRESSOR_LZMA
SetCompressor lzma
!endif

!endif

!ifdef ZIP2EXE_INSTALLDIR

InstallDir "${ZIP2EXE_INSTALLDIR}"

Function zip2exe.SetOutPath
SetOutPath "$INSTDIR"
FunctionEnd

!else ifdef ZIP2EXE_INSTALLDIR_WINAMP

InstallDir "$PROGRAMFILES\Winamp"
InstallDirRegKey HKLM
"Software\Microsoft\Windows\CurrentVersion\Uninstall\Winamp"
"UninstallString"

Function .onVerifyInstDir
IfFileExists $INSTDIR\winamp.exe WinampInstalled
Abort
WinampInstalled:
FunctionEnd

!ifdef ZIP2EXE_INSTALLDIR_WINAMPMODE

Var ZIP2EXE_TEMP1
Var ZIP2EXE_TEMP2

Function zip2exe.SetOutPath
!ifdef ZIP2EXE_INSTALLDIR_SKINS
StrCpy $ZIP2EXE_TEMP1 "$INSTDIR\Skins"
!else
StrCpy $ZIP2EXE_TEMP1 "$INSTDIR\Plugins"
!endif
ReadINIStr $ZIP2EXE_TEMP2 "$INSTDIR\winamp.ini"
"Winamp" "${ZIP2EXE_INSTALLDIR_WINAMPMODE}"
StrCmp $ZIP2EXE_TEMP2 "" End
IfFileExists $ZIP2EXE_TEMP2 0 End
StrCpy $ZIP2EXE_TEMP1 $ZIP2EXE_TEMP2
End:
SetOutPath $ZIP2EXE_TEMP1
FunctionEnd

!else

Function zip2exe.SetOutPath
!ifdef ZIP2EXE_INSTALLDIR_PLUGINS
SetOutPath "$INSTDIR\Plugins"
!else
SetOutPath "$INSTDIR"
!endif
FunctionEnd

!endif

!endif

!macro SECTION_BEGIN

Section ""

Call zip2exe.SetOutPath

!macroend

!macro SECTION_END

SectionEnd

!macroend

**************************************************

main.cpp:

#include <windows.h>
#include <stdio.h>
#include <ctype.h>
#include <commctrl.h>

/*

version 0.32
* Fixed codepage problems

version 0.31 (by Joost Verburg)
* LZMA compression support
* Fixed compression setting

version 0.31 (by Joost Verburg)
* Based on header files
* Improved interface
* Modern UI support
* New script code
* Immproved folder detection

portions Copyright © 1999-2001 Miguel Garrido
(mgarrido01@hotmail.com)

*/

extern "C"
{
#include "zlib/unzip.h"
};
#include "resource.h"

const char *g_errcaption="Zip2Exe Error";

HINSTANCE g_hInstance;
HWND g_hwnd;
HANDLE g_hThread;
char g_cmdline[1024];
int g_extracting;
int g_compressor;
int g_compressor_solid;
int g_mui;
int g_zipfile_size;

char *g_options="";//"/V3";

static BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg,
WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE
hPrevInst,
LPSTR lpszCmdParam, int nCmdShow)
{
g_hInstance=hInstance;

InitCommonControls();
return
DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),GetDesktopWindow(),DlgProc);
}
char tempzip_path[1024];

int made;

static void doRMDir(char *buf)
{
HANDLE h;
WIN32_FIND_DATA fd;
char *p=buf;
while (*p) p++;
lstrcpy(p,"\\*.*");
h = FindFirstFile(buf,&fd);
if (h != INVALID_HANDLE_VALUE)
{
do
{
if (fd.cFileName[0] != '.' ||
(fd.cFileName[1] != '.' && fd.cFileName[1]))
{
lstrcpy(p+1,fd.cFileName);
if (fd.dwFileAttributes & FILE_ATTRIBUTE_READONLY)

SetFileAttributes(buf,fd.dwFileAttributes^FILE_ATTRIBUTE_READONLY);
if (fd.dwFileAttributes &
FILE_ATTRIBUTE_DIRECTORY) doRMDir(buf);
else
{
DeleteFile(buf);
}
}
} while (FindNextFile(h,&fd));
FindClose(h);
}
p[0]=0; // fix buffer
RemoveDirectory(buf);
}

static void doMKDir(char *directory)
{
char *p, *p2;
char buf[MAX_PATH];
if (!*directory) return;
lstrcpy(buf,directory);
p=buf; while (*p) p++;
while (p >= buf && *p != '\\') p--;
p2 = buf;
if (p2[1] == ':') p2+=4;
else if (p2[0] == '\\' && p2[1] == '\\')
{
p2+=2;
while (*p2 && *p2 != '\\') p2++;
if (*p2) p2++;
while (*p2 && *p2 != '\\') p2++;
if (*p2) p2++;
}
if (p >= p2)
{
*p=0;
doMKDir(buf);
}
CreateDirectory(directory,NULL);
}

void tempzip_cleanup(HWND hwndDlg, int err)
{
if (tempzip_path[0]) doRMDir(tempzip_path);
tempzip_path[0]=0;
if (err)
{

SendDlgItemMessage(hwndDlg,IDC_ZIPINFO_FILES,LB_RESETCONTENT,0,0);
EnableWindow(GetDlgItem(hwndDlg,IDOK),0);
SetDlgItemText(hwndDlg,IDC_ZIPINFO_SUMMARY,"");
SetDlgItemText(hwndDlg,IDC_ZIPFILE,"");
SetDlgItemText(hwndDlg,IDC_OUTFILE,"");
}
}

int tempzip_make(HWND hwndDlg, char *fn)
{
char buf[MAX_PATH];
GetTempPath(MAX_PATH,buf);
GetTempFileName(buf,"z2e",GetTickCount(),tempzip_path);
if (!CreateDirectory(tempzip_path,NULL))
{
GetTempPath(MAX_PATH,tempzip_path);
strcat(tempzip_path,"\\nsi");
if (!CreateDirectory(tempzip_path,NULL))
{
tempzip_path[0]=0;
MessageBox(hwndDlg,"Error creating temporary
directory",g_errcaption,MB_OK|MB_ICONSTOP);
return 1;
}
}
FILE *fp=fopen(fn,"rb");
if (fp)
{
fseek(fp,0,SEEK_END);
g_zipfile_size=ftell(fp);
fclose(fp);
}
else g_zipfile_size=0;
unzFile f;
f = unzOpen(fn);
if (!f || unzGoToFirstFile(f) != UNZ_OK)
{
if (f) unzClose(f);
MessageBox(hwndDlg,"Error opening ZIP
file",g_errcaption,MB_OK|MB_ICONSTOP);
return 1;
}

int nf=0, nkb=0;
g_extracting=1;
do {
char filename[MAX_PATH];
unz_file_info info;

unzGetCurrentFileInfo(f,&info,filename,sizeof(filename),NULL,0,NULL,0);

// was zip created on MS-DOS/Windows?
if ((info.version & 0xFF00) == 0)
{
OemToCharBuff(filename, filename, strlen(filename));
}

if (filename[0] &&
filename[strlen(filename)-1] != '\\' &&
filename[strlen(filename)-1] != '/')
{
char *pfn=filename;
while (*pfn)
{
if (*pfn == '/') *pfn='\\';
pfn++;
}
pfn=filename;
if (pfn[1] == ':' && pfn[2] == '\\') pfn+=3;
while (*pfn == '\\') pfn++;

char out_filename[1024];
lstrcpy(out_filename,tempzip_path);
lstrcat(out_filename,"\\");
lstrcat(out_filename,pfn);
if (strstr(pfn,"\\"))
{
char buf[1024];
lstrcpy(buf,out_filename);
char *p=buf+strlen(buf);
while (p > buf && *p != '\\') p--;
*p=0;
if (buf[0]) doMKDir(buf);
}

if (unzOpenCurrentFile(f) == UNZ_OK)
{

SendDlgItemMessage(hwndDlg,IDC_ZIPINFO_FILES,LB_ADDSTRING,0,(LPARAM)pfn);
FILE *fp;
int l;
fp = fopen(out_filename,"wb");
if (fp)
{
do
{
char buf[1024];
l=unzReadCurrentFile(f,buf,sizeof(buf));
if (l > 0)
{
if (fwrite(buf,1,l,fp) != (unsigned int)l)
{
unzClose(f);
fclose(fp);
MessageBox(hwndDlg,"Error writing
output file(s)",g_errcaption,MB_OK|MB_ICONSTOP);
g_extracting=0;
return 1;
}
nkb++;
}
} while (l > 0);

fclose(fp);
}
else
{
unzClose(f);
MessageBox(hwndDlg,"Error opening output
file(s)",g_errcaption,MB_OK|MB_ICONSTOP);
g_extracting=0;
return 1;
}
nf++;
wsprintf(buf,"Extracting: %d files, %dKB",nf,nkb);
SetDlgItemText(hwndDlg,IDC_ZIPINFO_SUMMARY,buf);
MSG msg;
int quit=0;
while (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if (msg.message == WM_DESTROY && msg.hwnd ==
g_hwnd)
{
quit++;
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
unzCloseCurrentFile(f);
if (quit) break;
}
else
{
unzClose(f);
MessageBox(hwndDlg,"Error extracting from ZIP
file",g_errcaption,MB_OK|MB_ICONSTOP);
g_extracting=0;
return 1;
}
}
} while (unzGoToNextFile(f) == UNZ_OK);

g_extracting=0;
wsprintf(buf,"Extracted: %d files, %dKB",nf,nkb);
SetDlgItemText(hwndDlg,IDC_ZIPINFO_SUMMARY,buf);
unzClose(f);
return 0;
}

char *gp_winamp = "(WINAMP DIRECTORY)";
char *gp_winamp_plugins = "(WINAMP PLUG-INS DIRECTORY)";
char *gp_winamp_vis = "(WINAMP VIS PLUG-INS DIRECTORY)";
char *gp_winamp_dsp = "(WINAMP DSP PLUG-INS DIRECTORY)";
char *gp_winamp_skins = "(WINAMP SKINS DIRECTORY)";
char *gp_poi = "(PATH OF INSTALLER)";

void wnd_printf(const char *str)
{
if (!*str) return;
char existing_text[32000];
existing_text[0]=0;
UINT l=GetDlgItemText(g_hwnd, IDC_OUTPUTTEXT,
existing_text, 32000);
l+=strlen(str);

char *p=existing_text;
existing_text[31000]=0;
while (l > 31000 && *p)
{
while (*p != '\r' && *p != '\n' && *p)
{
p++;
l--;
}
while (*p == '\r' || *p == '\n')
{
p++;
l--;
}
}

char buf[31000];
lstrcpy(buf,p);
lstrcpy(existing_text,buf);
lstrcat(existing_text,str);

SetDlgItemText(g_hwnd, IDC_OUTPUTTEXT, existing_text);
SendDlgItemMessage(g_hwnd, IDC_OUTPUTTEXT,
EM_LINESCROLL, 0, SendDlgItemMessage(g_hwnd,
IDC_OUTPUTTEXT, EM_GETLINECOUNT, 0, 0)); // scroll to
the last line of the textbox

}

void ErrorMessage(char *str) //display detailed error info
{
LPVOID msg;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //
Default language
(LPTSTR) &msg,
0,
NULL
);
wnd_printf(str);
wnd_printf(": ");
wnd_printf((char*)msg);
LocalFree(msg);
}

DWORD WINAPI ThreadProc(LPVOID p) // thread that will
start & monitor wwwinamp
{
char buf[1024]; //i/o buffer
STARTUPINFO si={sizeof(si),};
SECURITY_ATTRIBUTES sa={sizeof(sa),};
SECURITY_DESCRIPTOR sd={0,}; //security
information for pipes
PROCESS_INFORMATION pi={0,};
HANDLE newstdout=0,read_stdout=0; //pipe handles

OSVERSIONINFO osv={sizeof(osv)};
GetVersionEx(&osv);
if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT)
//initialize security descriptor (Windows NT)
{

InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, true, NULL, false);
sa.lpSecurityDescriptor = &sd;
}
else sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = true; //allow inheritable
handles

if (!CreatePipe(&read_stdout,&newstdout,&sa,0))
//create stdout pipe
{
ErrorMessage("CreatePipe");
PostMessage(g_hwnd,WM_USER+1203,0,1);
return 1;
}

GetStartupInfo(&si); //set startupinfo for the
spawned process
/*
The dwFlags member tells CreateProcess how to make
the process.
STARTF_USESTDHANDLES validates the hStd* members.
STARTF_USESHOWWINDOW
validates the wShowWindow member.
*/
si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
si.hStdOutput = newstdout;
si.hStdError = newstdout; //set the new handles
for the child process

//
*******************************************************************
// If there is a command line in the config file, use
it for create process

//spawn the child process
if
(!CreateProcess(NULL,g_cmdline,NULL,NULL,TRUE,CREATE_NEW_CONSOLE,
NULL,tempzip_path,&si,&pi))
{
ErrorMessage("CreateProcess");
wnd_printf("\r\nPlease make sure the path to
makensis.exe is correct.");
CloseHandle(newstdout);
CloseHandle(read_stdout);
PostMessage(g_hwnd,WM_USER+1203,0,1);
return 1;
}

unsigned long exit=0; //process exit code
unsigned long bread; //bytes read
unsigned long avail; //bytes available

memset(buf,0,sizeof(buf));
while (1) //main program loop
{
PeekNamedPipe(read_stdout,buf,1023,&bread,&avail,NULL);
//check to see if there is any data to read from stdout
if (bread != 0)
{
memset(buf,0,sizeof(buf));
if (avail > 1023)
{
while (bread >= 1023)
{
ReadFile(read_stdout,buf,1023,&bread,NULL);
//read the stdout pipe
wnd_printf(buf);
memset(buf,0,sizeof(buf));
}
}
else
{
ReadFile(read_stdout,buf,1023,&bread,NULL);
wnd_printf(buf);
}
}

GetExitCodeProcess(pi.hProcess,&exit); //while
the process is running
if (exit != STILL_ACTIVE)
break;

Sleep(100);
}
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(newstdout);
CloseHandle(read_stdout);

wsprintf(buf,"(source ZIP size was %d
bytes)\r\n",g_zipfile_size);
wnd_printf(buf);

PostMessage(g_hwnd,WM_USER+1203,0,0);
return 0;
}

char nsifilename[MAX_PATH];

void makeEXE(HWND hwndDlg)
{
char buf[2048];
GetTempPath(MAX_PATH,buf);
GetTempFileName(buf,"zne",0,nsifilename);
FILE *fp=fopen(nsifilename,"w");
if (!fp)
{
MessageBox(hwndDlg,"Error writing .NSI
file",g_errcaption,MB_OK|MB_ICONSTOP);
PostMessage(g_hwnd,WM_USER+1203,0,0);
return;
}
GetDlgItemText(hwndDlg,IDC_INSTNAME,buf,sizeof(buf));
fprintf(fp,"!define ZIP2EXE_NAME `%s`\n",buf);
GetDlgItemText(hwndDlg,IDC_OUTFILE,buf,sizeof(buf));
fprintf(fp,"!define ZIP2EXE_OUTFILE `%s`\n",buf);
if (g_compressor == 1)
fprintf(fp,"!define ZIP2EXE_COMPRESSOR_ZLIB\n");
if (g_compressor == 2)
fprintf(fp,"!define ZIP2EXE_COMPRESSOR_BZIP2\n");
if (g_compressor == 3)
fprintf(fp,"!define ZIP2EXE_COMPRESSOR_LZMA\n");
if (g_compressor_solid == 1)
fprintf(fp,"!define ZIP2EXE_COMPRESSOR_SOLID\n");
GetDlgItemText(hwndDlg,IDC_INSTPATH,buf,sizeof(buf));
char *outpath = "$INSTDIR";
int iswinamp=0;
char *iswinampmode=NULL;
if (!strcmp(buf,gp_poi)) lstrcpy(buf,"$EXEDIR");

if (!strcmp(buf,gp_winamp))
{
iswinamp=1;
}
if (!strcmp(buf,gp_winamp_plugins))
{
iswinamp=1;
fprintf(fp,"!define ZIP2EXE_INSTALLDIR_PLUGINS\n");
}
if (!strcmp(buf,gp_winamp_vis))
{
iswinamp=1;
iswinampmode="VisDir";
}
if (!strcmp(buf,gp_winamp_dsp))
{
iswinamp=1;
iswinampmode="DSPDir";
}
if (!strcmp(buf,gp_winamp_skins))
{
iswinamp=1;
iswinampmode="SkinDir";
fprintf(fp,"!define ZIP2EXE_INSTALLDIR_SKINS\n");
}

if (iswinamp)
{
fprintf(fp,"!define ZIP2EXE_INSTALLDIR_WINAMP\n");

if (iswinampmode)
{
fprintf(fp,"!define ZIP2EXE_INSTALLDIR_WINAMPMODE
`%s`\n",iswinampmode);
}
}
else // set out path to $INSTDIR
{
fprintf(fp,"!define ZIP2EXE_INSTALLDIR `%s`\n",buf);
}

fprintf(fp,"!include
`${NSISDIR}\\Contrib\\zip2exe\\Base.nsh`\n");
fprintf(fp,"!include
`${NSISDIR}\\Contrib\\zip2exe\\%s.nsh`\n",g_mui?"Modern":"Classic");

fprintf(fp,"!insertmacro SECTION_BEGIN\n");
fprintf(fp,"File /r `%s\\*.*`\n",tempzip_path);
fprintf(fp,"!insertmacro SECTION_END\n");

fclose(fp);

char g_makensis_path[MAX_PATH];
char *p=g_makensis_path;

GetModuleFileName(g_hInstance,g_makensis_path,sizeof(g_makensis_path));
while (*p) p++;
while (p >= g_makensis_path && *p != '\\') p--;
strcpy(p+1,"makensis.exe");

WIN32_FIND_DATA fd;
HANDLE h=FindFirstFile(g_makensis_path,&fd);
if (h==INVALID_HANDLE_VALUE)
{
if
((p-g_makensis_path>4)&&(tolower(*(p-1))=='n')&&(tolower(*(p-2))=='i')&&(tolower(*(p-3))=='b')&&(*(p-4)=='\\'))
{
p -= 4;
strcpy(p+1,"makensis.exe");
h=FindFirstFile(g_makensis_path,&fd);
if (h==INVALID_HANDLE_VALUE)
{
MessageBox(hwndDlg,"Error finding
makensis.exe.",g_errcaption,MB_OK|MB_ICONSTOP);
PostMessage(g_hwnd,WM_USER+1203,0,0);
return;
}
}
}
if (h!=INVALID_HANDLE_VALUE) FindClose(h);

wsprintf(g_cmdline,"\"%s\" %s
\"%s\"",g_makensis_path,g_options,nsifilename);

DWORD id;
g_hThread=CreateThread(NULL,0,ThreadProc,0,0,&id);

}

BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM
wParam, LPARAM lParam)
{
static int
ids[]={IDC_INFO,IDC_NSISICON,IDC_SZIPFRAME,IDC_BROWSE,IDC_ZIPFILE,IDC_ZIPINFO_SUMMARY,IDC_ZIPINFO_FILES,IDC_OFRAME,IDC_INAMEST,

IDC_INSTNAME,IDC_INSTPATH,IDC_OEFST,IDC_OUTFILE,IDC_BROWSE2,IDC_COMPRESSOR,IDC_ZLIB,IDC_BZIP2,IDC_LZMA,IDC_SOLID,IDC_INTERFACE,IDC_MODERNUI,IDC_CLASSICUI};
static HICON hIcon;
static HFONT hFont;
if (uMsg == WM_DESTROY) { if (hIcon)
DeleteObject(hIcon); hIcon=0; if (hFont)
DeleteObject(hFont); hFont=0; }
switch (uMsg)
{
case WM_INITDIALOG:
g_hwnd=hwndDlg;
CheckDlgButton(hwndDlg,IDC_LZMA,BST_CHECKED);
CheckDlgButton(hwndDlg,IDC_MODERNUI,BST_CHECKED);

SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)gp_poi);

SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)"$TEMP");

SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)"$SYSDIR");

SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)"$WINDIR");

SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)"$DESKTOP");

SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)"$DESKTOP\\YourNameHere");

SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)"$PROGRAMFILES\\YourNameHere");

SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)"$STARTMENU");

SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)"$SMPROGRAMS");

SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)gp_winamp);

SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)gp_winamp_plugins);

SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)gp_winamp_vis);

SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)gp_winamp_dsp);

SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)gp_winamp_skins);

SetDlgItemText(hwndDlg,IDC_INSTPATH,gp_poi);

hIcon=LoadIcon(g_hInstance,MAKEINTRESOURCE(IDI_ICON1));
SetClassLong(hwndDlg,GCL_HICON,(long)hIcon);

hFont=CreateFont(15,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,
OUT_CHARACTER_PRECIS,
CLIP_DEFAULT_PRECIS,

DEFAULT_QUALITY,FIXED_PITCH|FF_DONTCARE,"Courier New");

SendDlgItemMessage(hwndDlg,IDC_OUTPUTTEXT,WM_SETFONT,(WPARAM)hFont,0);
return 1;
case WM_CLOSE:
if (!g_hThread)
{
tempzip_cleanup(hwndDlg,0);
EndDialog(hwndDlg,1);
}
break;
case WM_USER+1203:

if (g_hThread)
{
if (!lParam)
ShowWindow(GetDlgItem(hwndDlg,IDC_TEST),SW_SHOWNA);
CloseHandle(g_hThread);
g_hThread=0;
}
made=1;
ShowWindow(GetDlgItem(hwndDlg,IDC_BACK),SW_SHOWNA);
EnableWindow(GetDlgItem(hwndDlg,IDOK),1);
if (nsifilename[0]) DeleteFile(nsifilename);
nsifilename[0]=0;
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_BROWSE:
if (!g_extracting) {
OPENFILENAME l={sizeof(l),};
char buf[1024];
l.hwndOwner = hwndDlg;
l.lpstrFilter = "ZIP Files\0*.zip\0All
Files\0*.*\0";
l.lpstrFile = buf;
l.nMaxFile = 1023;
l.lpstrTitle = "Open ZIP File";
l.lpstrDefExt = "zip";
l.lpstrInitialDir = NULL;
l.Flags =
OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST;
buf[0]=0;
if (GetOpenFileName(&l))
{
char buf2[1024];
lstrcpy(buf2,buf);
tempzip_cleanup(hwndDlg,1);
SetDlgItemText(hwndDlg,IDC_ZIPFILE,buf);
char *t=buf+strlen(buf);
while (t > buf && *t != '\\' && *t !=
'.') t--;
{
char *p=t;
while (p >= buf && *p != '\\') p--;
p++;
*t=0;

SetDlgItemText(hwndDlg,IDC_INSTNAME,p[0]?p:"Stuff");
}
strcpy(t,".exe");
SetDlgItemText(hwndDlg,IDC_OUTFILE,buf);
if (tempzip_make(hwndDlg,buf2))
tempzip_cleanup(hwndDlg,1);
else
{
EnableWindow(GetDlgItem(hwndDlg,IDOK),1);
}
}
}
break;
case IDC_BROWSE2:
{
OPENFILENAME l={sizeof(l),};
char buf[1024];
l.hwndOwner = hwndDlg;
l.lpstrFilter = "Executables\0*.exe\0All
Files\0*.*\0";
l.lpstrFile = buf;
l.nMaxFile = 1023;
l.lpstrTitle = "Select Output EXE File";
l.lpstrDefExt = "exe";
l.lpstrInitialDir = NULL;
l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER;

GetDlgItemText(hwndDlg,IDC_OUTFILE,buf,sizeof(buf));
if (GetSaveFileName(&l))
{
SetDlgItemText(hwndDlg,IDC_OUTFILE,buf);
}
}
break;
case IDC_BACK:
if (!g_hThread)
{
made=0;

ShowWindow(GetDlgItem(hwndDlg,IDC_BACK),SW_HIDE);

ShowWindow(GetDlgItem(hwndDlg,IDC_TEST),SW_HIDE);

ShowWindow(GetDlgItem(hwndDlg,IDC_OUTPUTTEXT),SW_HIDE);
{
int x;
for (x = 0; x <
sizeof(ids)/sizeof(ids[0]); x ++)

ShowWindow(GetDlgItem(hwndDlg,ids[x]),SW_SHOWNA);
SetDlgItemText(hwndDlg,IDOK,"&Generate");
EnableWindow(GetDlgItem(hwndDlg,IDOK),1);
}
}
break;
case IDC_TEST:
if (!g_hThread) {
char buf[1024];

GetDlgItemText(hwndDlg,IDC_OUTFILE,buf,sizeof(buf));
ShellExecute(hwndDlg,"open",buf,"","",SW_SHOW);
}
break;
case IDOK:
if (!g_hThread)
{
if (!made)
{
if (IsDlgButtonChecked(hwndDlg,IDC_ZLIB))
g_compressor = 1;
if (IsDlgButtonChecked(hwndDlg,IDC_BZIP2))
g_compressor = 2;
if (IsDlgButtonChecked(hwndDlg,IDC_LZMA))
g_compressor = 3;
if (IsDlgButtonChecked(hwndDlg,IDC_SOLID))
g_compressor_solid = 1;
else
g_compressor_solid = 0;

g_mui=!IsDlgButtonChecked(hwndDlg,IDC_CLASSICUI);
SetDlgItemText(g_hwnd, IDC_OUTPUTTEXT, "");
int x;
for (x = 0; x <
sizeof(ids)/sizeof(ids[0]); x ++)

ShowWindow(GetDlgItem(hwndDlg,ids[x]),SW_HIDE);

ShowWindow(GetDlgItem(hwndDlg,IDC_OUTPUTTEXT),SW_SHOWNA);
SetDlgItemText(hwndDlg,IDOK,"&Close");
EnableWindow(GetDlgItem(hwndDlg,IDOK),0);

makeEXE(hwndDlg);
}
else
{
tempzip_cleanup(hwndDlg,0);
EndDialog(hwndDlg,0);
}
}
break;
}
break;
}
return 0;
}

**************************************************

res.rc:

// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include <winresrc.h>

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32

/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_DIALOG1 DIALOGEX 0, 0, 360, 271
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_POPUP |
WS_CAPTION |
WS_SYSMENU
CAPTION "Zip2Exe 0.32"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
ICON IDI_ICON1,IDC_NSISICON,6,6,20,20
LTEXT "Zip2Exe converts a ZIP file to a
self extracting archive (a simple NSIS installer). To
customize the NSIS script code, modify the header files
in the 'Contrib\\zip2exe' folder.",
IDC_INFO,36,6,312,18
GROUPBOX "Source ZIP
File",IDC_SZIPFRAME,7,31,347,101
PUSHBUTTON "&Open...",IDC_BROWSE,18,48,54,13
EDITTEXT
IDC_ZIPFILE,78,48,264,12,ES_AUTOHSCROLL | ES_READONLY |
NOT WS_TABSTOP
LTEXT "",IDC_ZIPINFO_SUMMARY,18,66,324,8
LISTBOX
IDC_ZIPINFO_FILES,18,78,324,45,LBS_NOINTEGRALHEIGHT |
LBS_NOSEL | WS_VSCROLL
GROUPBOX "Output Installer
Options",IDC_OFRAME,6,138,347,108
LTEXT "Installer
Name",IDC_INAMEST,18,156,48,8
EDITTEXT
IDC_INSTNAME,78,156,264,12,ES_AUTOHSCROLL
LTEXT "Interface",IDC_INTERFACE,18,174,30,8
CONTROL
"Modern",IDC_MODERNUI,"Button",BS_AUTORADIOBUTTON,78,174,
42,12
CONTROL
"Classic",IDC_CLASSICUI,"Button",BS_AUTORADIOBUTTON,132,
174,42,12
LTEXT "Default Folder",IDC_DEPST,18,192,48,8
COMBOBOX
IDC_INSTPATH,78,192,264,126,CBS_DROPDOWN | WS_VSCROLL |
WS_TABSTOP | CBS_AUTOHSCROLL
LTEXT "Output EXE File",IDC_OEFST,18,210,54,8
EDITTEXT
IDC_OUTFILE,78,210,204,12,ES_AUTOHSCROLL
PUSHBUTTON "&Browse...",IDC_BROWSE2,288,210,54,13
LTEXT
"Compression",IDC_COMPRESSOR,18,228,42,8
CONTROL
"LZMA",IDC_LZMA,"Button",BS_AUTORADIOBUTTON,78,228,36,10
CONTROL
"BZip2",IDC_BZIP2,"Button",BS_AUTORADIOBUTTON,132,228,36,
10
CONTROL
"ZLib",IDC_ZLIB,"Button",BS_AUTORADIOBUTTON,186,228,30,
10
CONTROL
"Solid",IDC_SOLID,"Button",BS_AUTOCHECKBOX,240,228,30,
10
DEFPUSHBUTTON
"&Generate",IDOK,306,252,48,14,WS_DISABLED
PUSHBUTTON "&Test",IDC_TEST,246,252,49,14,NOT
WS_VISIBLE
PUSHBUTTON "< &Back",IDC_BACK,6,252,48,14,NOT
WS_VISIBLE
EDITTEXT
IDC_OUTPUTTEXT,0,0,359,246,ES_MULTILINE | ES_AUTOVSCROLL |
ES_AUTOHSCROLL | ES_READONLY | NOT
WS_VISIBLE |
WS_VSCROLL | WS_HSCROLL
END

/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_DIALOG1, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 353
TOPMARGIN, 7
BOTTOMMARGIN, 264
END
END
#endif // APSTUDIO_INVOKED

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE
BEGIN
"resource.h\0"
END

2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END

3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END

#endif // APSTUDIO_INVOKED

/////////////////////////////////////////////////////////////////////////////
//
// Icon
//

// Icon with lowest ID value placed first to ensure
application icon
// remains consistent on all systems.
IDI_ICON1 ICON "icon.ico"

/////////////////////////////////////////////////////////////////////////////
//
// RT_MANIFEST
//

1 RT_MANIFEST
"zip2exe.xml"
#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////

#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//

/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

**************************************************

resource.h:

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by res.rc
//
#define IDD_DIALOG1 101
#define IDI_ICON1 102
#define IDC_ZIPFILE 1000
#define IDC_BROWSE 1001
#define IDC_ZIPINFO_SUMMARY 1002
#define IDC_ZIPINFO_FILES 1004
#define IDC_INSTPATH 1005
#define IDC_DESCTEXT 1006
#define IDC_OUTFILE 1007
#define IDC_BROWSE2 1008
#define IDC_INSTNAME 1009
#define IDC_SZIPFRAME 1010
#define IDC_OFRAME 1011
#define IDC_INAMEST 1012
#define IDC_DEPST 1014
#define IDC_OEFST 1015
#define IDC_OUTPUTTEXT 1016
#define IDC_TEST 1017
#define IDC_BACK 1018
#define IDC_COMPILER 1019
#define IDC_ZLIB 1020
#define IDC_MODERNUI 1021
#define IDC_COMPRESSOR 1022
#define IDC_INTERFACE 1023
#define IDC_BZIP2 1024
#define IDC_CLASSICUI 1025
#define IDC_INFO 1026
#define IDC_NSISICON 1027
#define IDC_BZIP3 1028
#define IDC_LZMA 1028
#define IDC_SOLID 1029

// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 103
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1028
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

Discussion

  • Anonymous

    Anonymous - 2005-10-21

    Source code as ZIP file

     
  • Amir Szekely

    Amir Szekely - 2005-10-21
    • assigned_to: joostverburg --> kichik
    • status: open --> closed-accepted
     
  • Amir Szekely

    Amir Szekely - 2005-10-21
    • summary: Added Checkbox for solid compression to Zip2Exe tool --> zip2exe: checkbox for solid compression
     
  • Amir Szekely

    Amir Szekely - 2005-10-21

    Logged In: YES
    user_id=584402

    Thanks, applied.

    Please don't paste in the entire file in the tracker, it
    makes it impossible to read. Also attach a patch if
    possible, instead of the entire file.

     

Log in to post a comment.