srcanamdw/codescanner/pyinstaller/source/windows/winmain.c
changeset 1 22878952f6e2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanamdw/codescanner/pyinstaller/source/windows/winmain.c	Thu Feb 18 12:29:02 2010 +0530
@@ -0,0 +1,155 @@
+/*
+ * Bootloader for a packed executable.
+ * Copyright (C) 2005, Giovanni Bajo
+ * Based on previous work under copyright (c) 2002 McMillan Enterprises, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * In addition to the permissions in the GNU General Public License, the
+ * authors give you unlimited permission to link or embed the compiled
+ * version of this file into combinations with other programs, and to
+ * distribute those combinations without any restriction coming from the
+ * use of this file. (The General Public License restrictions do apply in
+ * other respects; for example, they cover modification of the file, and
+ * distribution when not linked into a combine executable.)
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+#include "launch.h"
+#include <windows.h>
+#include <commctrl.h> // InitCommonControls
+#include <signal.h>
+
+int relaunch(char *thisfile, char *workpath)
+{
+	char envvar[_MAX_PATH + 12];
+	SECURITY_ATTRIBUTES sa;
+	STARTUPINFO si;
+	PROCESS_INFORMATION pi;
+	int rc = 0;
+
+	// the parent process should ignore all signals it can
+	signal(SIGABRT, SIG_IGN);
+	signal(SIGINT, SIG_IGN);
+	signal(SIGTERM, SIG_IGN);
+	signal(SIGBREAK, SIG_IGN);
+
+	VS("Setting up to run child\n");
+	sa.nLength = sizeof(sa);
+	sa.lpSecurityDescriptor = NULL;
+	sa.bInheritHandle = TRUE;
+	GetStartupInfo(&si);
+	si.lpReserved = NULL;
+	si.lpDesktop = NULL;
+	si.lpTitle = NULL;
+	si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
+	si.wShowWindow = SW_NORMAL;
+	si.hStdInput = (void*)_get_osfhandle(fileno(stdin));
+	si.hStdOutput = (void*)_get_osfhandle(fileno(stdout));
+	si.hStdError = (void*)_get_osfhandle(fileno(stderr));
+	/* tell pass 2 where we extracted to */
+	VS("Setting magic environment var\n");
+	strcpy(envvar, "_MEIPASS2=");
+	strcat(envvar, workpath);
+	_putenv(envvar);
+	VS("Creating child process\n");
+	if (CreateProcess( 
+			thisfile, // pointer to name of executable module 
+			GetCommandLine(),  // pointer to command line string 
+			&sa,  // pointer to process security attributes 
+			NULL,  // pointer to thread security attributes 
+			TRUE,  // handle inheritance flag 
+			0,  // creation flags 
+			NULL,  // pointer to new environment block 
+			NULL,  // pointer to current directory name 
+			&si,  // pointer to STARTUPINFO 
+			&pi  // pointer to PROCESS_INFORMATION 
+			)) {
+		VS("Waiting for child process to finish...\n");
+		WaitForSingleObject(pi.hProcess, INFINITE);
+		GetExitCodeProcess(pi.hProcess, (unsigned long *)&rc);
+	}
+	else {
+		FATALERROR("Error creating child process!\n");
+		rc = -1;
+	}
+	return rc;
+}
+
+
+#ifdef _CONSOLE
+int main(int argc, char* argv[])
+#else
+int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
+						LPSTR lpCmdLine, int nCmdShow )
+#endif
+{
+	char here[_MAX_PATH + 1];
+	char thisfile[_MAX_PATH + 1];
+	int rc = 0;
+	char *workpath = NULL;
+	char *p;
+	int len;
+#ifndef _CONSOLE
+	int argc = __argc;
+	char **argv = __argv;
+#endif
+
+	// Initialize common controls (needed to link with commctrl32.dll and
+	// obtain native XP look & feel).
+	InitCommonControls();
+
+	// fill in thisfile
+	if (!GetModuleFileNameA(NULL, thisfile, _MAX_PATH)) {
+		FATALERROR("System error - unable to load!");
+		return -1;
+	}
+	p = thisfile+strlen(thisfile) - 4;
+	if (strnicmp(p, ".exe", 4) != 0)
+		strcat(thisfile, ".exe");
+
+	// fill in here (directory of thisfile)
+	//GetModuleFileName returns an absolute path
+	strcpy(here, thisfile);
+	for (p=here+strlen(here); *p != '\\' && p >= here+2; --p);
+	*++p = '\0';
+	len = p - here;
+
+	workpath = getenv( "_MEIPASS2" );
+	rc = init(here, &thisfile[len], workpath);
+	if (rc)
+		return rc;
+	if (workpath) {
+		// we're the "child" process
+		rc = doIt(argc, argv);
+		finalizePython();
+	}
+	else {
+		if (extractBinaries(&workpath)) {
+			VS("Error extracting binaries");
+			return -1;
+		}
+		// if workpath got set to non-NULL, we've extracted stuff
+		if (workpath) {
+			// run the "child" process, then clean up
+			rc = relaunch(thisfile, workpath);
+		}
+		else {
+			// no "child" process necessary
+			rc = doIt(argc, argv);
+			finalizePython();
+		}
+		cleanUp();
+	}
+	return rc;
+}