srcanamdw/codescanner/pyinstaller/source/windows/dllmain.c
author noe\swadi
Thu, 18 Feb 2010 12:29:02 +0530
changeset 1 22878952f6e2
permissions -rw-r--r--
Committing the CodeScanner Core tool This component has been moved from the StaticAnaApps package. BUG : 5889 (http://developer.symbian.org/webbugs/show_bug.cgi?id=5889).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     1
/*
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     2
 * Bootloader for a DLL COM server.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     3
 * Copyright (C) 2005, Giovanni Bajo
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     4
 * Based on previous work under copyright (c) 2002 McMillan Enterprises, Inc.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     5
 *
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     6
 * This program is free software; you can redistribute it and/or
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     7
 * modify it under the terms of the GNU General Public License
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     8
 * as published by the Free Software Foundation; either version 2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     9
 * of the License, or (at your option) any later version.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    10
 *
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    11
 * In addition to the permissions in the GNU General Public License, the
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    12
 * authors give you unlimited permission to link or embed the compiled
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    13
 * version of this file into combinations with other programs, and to
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    14
 * distribute those combinations without any restriction coming from the
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    15
 * use of this file. (The General Public License restrictions do apply in
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    16
 * other respects; for example, they cover modification of the file, and
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    17
 * distribution when not linked into a combine executable.)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    18
 *
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    19
 * This program is distributed in the hope that it will be useful,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    20
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    21
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    22
 * GNU General Public License for more details.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    23
 *
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    24
 * You should have received a copy of the GNU General Public License
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    25
 * along with this program; if not, write to the Free Software
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    26
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    27
 */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    28
#include "launch.h"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    29
#include <windows.h>
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    30
#include <olectl.h>
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    31
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    32
typedef int (__stdcall *__PROC__DllCanUnloadNow) (void);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    33
__PROC__DllCanUnloadNow Pyc_DllCanUnloadNow = NULL;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    34
typedef HRESULT (__stdcall *__PROC__DllGetClassObject) (REFCLSID, REFIID, LPVOID *);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    35
__PROC__DllGetClassObject Pyc_DllGetClassObject = NULL;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    36
typedef int (__cdecl *__PROC__DllRegisterServerEx) (const char *);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    37
__PROC__DllRegisterServerEx Pyc_DllRegisterServerEx = NULL;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    38
typedef int (__cdecl *__PROC__DllUnregisterServerEx) (const char *);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    39
__PROC__DllUnregisterServerEx Pyc_DllUnregisterServerEx = NULL;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    40
typedef void (__cdecl *__PROC__PyCom_CoUninitialize) (void);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    41
__PROC__PyCom_CoUninitialize PyCom_CoUninitialize = NULL;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    42
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    43
HINSTANCE gPythoncom = 0;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    44
char here[_MAX_PATH + 1];
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    45
int LoadPythonCom(void);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    46
void releasePythonCom(void);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    47
HINSTANCE gInstance;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    48
PyThreadState *thisthread = NULL;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    49
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    50
int launch(char const * archivePath, char  const * archiveName)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    51
{
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    52
	PyObject *obHandle;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    53
	int loadedNew = 0;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    54
	char pathnm[_MAX_PATH];
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    55
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    56
    VS("START");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    57
	strcpy(pathnm, archivePath);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    58
	strcat(pathnm, archiveName);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    59
    /* Set up paths */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    60
    if (setPaths(archivePath, archiveName))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    61
        return -1;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    62
	VS("Got Paths");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    63
    /* Open the archive */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    64
    if (openArchive())
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    65
        return -1;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    66
	VS("Opened Archive");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    67
    /* Load Python DLL */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    68
    if (attachPython(&loadedNew))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    69
        return -1;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    70
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    71
	if (loadedNew) {
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    72
		/* Start Python with silly command line */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    73
		PyEval_InitThreads();
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    74
		if (startPython(1, (char**)&pathnm))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    75
			return -1;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    76
		VS("Started new Python");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    77
		thisthread = PyThreadState_Swap(NULL);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    78
		PyThreadState_Swap(thisthread);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    79
	}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    80
	else {
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    81
		VS("Attached to existing Python");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    82
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    83
		/* start a mew interp */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    84
		thisthread = PyThreadState_Swap(NULL);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    85
		PyThreadState_Swap(thisthread);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    86
		if (thisthread == NULL) {
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    87
			thisthread = Py_NewInterpreter();
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    88
			VS("created thisthread");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    89
		}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    90
		else
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    91
			VS("grabbed thisthread");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    92
		PyRun_SimpleString("import sys;sys.argv=[]");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    93
	}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    94
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    95
	/* a signal to scripts */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    96
	PyRun_SimpleString("import sys;sys.frozen='dll'\n");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    97
	VS("set sys.frozen");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    98
	/* Create a 'frozendllhandle' as a counterpart to
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    99
	   sys.dllhandle (which is the Pythonxx.dll handle)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   100
	*/
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   101
	obHandle = Py_BuildValue("i", gInstance);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   102
	PySys_SetObject("frozendllhandle", obHandle);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   103
	Py_XDECREF(obHandle);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   104
    /* Import modules from archive - this is to bootstrap */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   105
    if (importModules())
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   106
        return -1;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   107
	VS("Imported Modules");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   108
    /* Install zlibs - now import hooks are in place */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   109
    if (installZlibs())
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   110
        return -1;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   111
	VS("Installed Zlibs");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   112
    /* Run scripts */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   113
    if (runScripts())
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   114
        return -1;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   115
	VS("All scripts run");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   116
    if (PyErr_Occurred()) {
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   117
		// PyErr_Print();
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   118
		//PyErr_Clear();
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   119
		VS("Some error occurred");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   120
    }
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   121
	VS("PGL released");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   122
	// Abandon our thread state.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   123
	PyEval_ReleaseThread(thisthread);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   124
    VS("OK.");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   125
    return 0;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   126
}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   127
void startUp()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   128
{
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   129
	char thisfile[_MAX_PATH + 1];
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   130
	char *p;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   131
	int len;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   132
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   133
	if (!GetModuleFileNameA(gInstance, thisfile, _MAX_PATH)) {
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   134
		FATALERROR("System error - unable to load!");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   135
		return;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   136
	}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   137
	// fill in here (directory of thisfile)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   138
	//GetModuleFileName returns an absolute path
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   139
	strcpy(here, thisfile);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   140
	for (p=here+strlen(here); *p != '\\' && p >= here+2; --p);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   141
	*++p = '\0';
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   142
	len = p - here;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   143
	//VS(here);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   144
	//VS(&thisfile[len]);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   145
	launch(here, &thisfile[len]);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   146
	LoadPythonCom();
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   147
	// Now Python is up and running (any scripts have run)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   148
}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   149
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   150
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   151
{
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   152
	char msg[40];
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   153
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   154
	if ( dwReason == DLL_PROCESS_ATTACH) {
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   155
		sprintf(msg, "Attach from thread %x", GetCurrentThreadId()); 
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   156
		VS(msg);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   157
		gInstance = hInstance;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   158
	}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   159
	else if ( dwReason == DLL_PROCESS_DETACH ) {
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   160
		VS("Process Detach");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   161
		//if (gPythoncom)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   162
		//	releasePythonCom();
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   163
		//finalizePython();
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   164
	}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   165
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   166
	return TRUE; 
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   167
}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   168
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   169
int LoadPythonCom()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   170
{
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   171
	char dllpath[_MAX_PATH+1];
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   172
	VS("Loading Pythoncom");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   173
	// see if pythoncom is already loaded
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   174
	sprintf(dllpath, "pythoncom%02d.dll", getPyVersion());
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   175
	gPythoncom = GetModuleHandle(dllpath);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   176
	if (gPythoncom == NULL) {
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   177
		sprintf(dllpath, "%spythoncom%02d.dll", here, getPyVersion());
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   178
		//VS(dllpath);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   179
		gPythoncom = LoadLibraryEx( dllpath, // points to name of executable module 
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   180
					   NULL, // HANDLE hFile, // reserved, must be NULL 
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   181
					   LOAD_WITH_ALTERED_SEARCH_PATH // DWORD dwFlags // entry-point execution flag 
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   182
					  ); 
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   183
	}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   184
	if (!gPythoncom) {
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   185
		VS("Pythoncom failed to load");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   186
		return -1;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   187
	}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   188
	// debugging
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   189
	GetModuleFileNameA(gPythoncom, dllpath, _MAX_PATH);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   190
	VS(dllpath);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   191
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   192
	Pyc_DllCanUnloadNow = (__PROC__DllCanUnloadNow)GetProcAddress(gPythoncom, "DllCanUnloadNow");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   193
	Pyc_DllGetClassObject = (__PROC__DllGetClassObject)GetProcAddress(gPythoncom, "DllGetClassObject");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   194
	// DllRegisterServerEx etc are mainly used for "scripts", so that regsvr32.exe can be run on
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   195
	// a .py file, for example.  They aren't really relevant here.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   196
	Pyc_DllRegisterServerEx = (__PROC__DllRegisterServerEx)GetProcAddress(gPythoncom, "DllRegisterServerEx");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   197
	Pyc_DllUnregisterServerEx = (__PROC__DllUnregisterServerEx)GetProcAddress(gPythoncom, "DllUnregisterServerEx");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   198
	PyCom_CoUninitialize = (__PROC__PyCom_CoUninitialize)GetProcAddress(gPythoncom, "PyCom_CoUninitialize");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   199
	if (Pyc_DllGetClassObject == NULL) {
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   200
		VS("Couldn't get DllGetClassObject from pythoncom!");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   201
		return -1;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   202
	}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   203
	if (PyCom_CoUninitialize == NULL) {
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   204
		VS("Couldn't get PyCom_CoUninitialize from pythoncom!");
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   205
		return -1;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   206
	}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   207
	return 0;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   208
}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   209
void releasePythonCom(void)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   210
{
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   211
	if (gPythoncom) {
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   212
		PyCom_CoUninitialize();
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   213
		FreeLibrary(gPythoncom);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   214
		gPythoncom = 0;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   215
	}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   216
}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   217
//__declspec(dllexport) int __stdcall DllCanUnloadNow(void)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   218
//__declspec(dllexport)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   219
//STDAPI
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   220
HRESULT __stdcall DllCanUnloadNow(void)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   221
{
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   222
	char msg[80];
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   223
	HRESULT rc;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   224
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   225
	sprintf(msg, "DllCanUnloadNow from thread %x", GetCurrentThreadId()); 
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   226
	VS(msg);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   227
	if (gPythoncom == 0)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   228
		startUp();
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   229
	rc = Pyc_DllCanUnloadNow();
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   230
	sprintf(msg, "DllCanUnloadNow returns %x", rc); 
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   231
	VS(msg);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   232
	//if (rc == S_OK)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   233
	//	PyCom_CoUninitialize();
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   234
	return rc;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   235
}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   236
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   237
//__declspec(dllexport) int __stdcall DllGetClassObject(void *rclsid, void *riid, void *ppv)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   238
HRESULT __stdcall DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   239
{
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   240
	char msg[80];
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   241
	HRESULT rc;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   242
	sprintf(msg, "DllGetClassObject from thread %x", GetCurrentThreadId()); 
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   243
	VS(msg);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   244
	if (gPythoncom == 0)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   245
		startUp();
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   246
	rc = Pyc_DllGetClassObject(rclsid, riid, ppv);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   247
	sprintf(msg, "DllGetClassObject set %x and returned %x", *ppv, rc);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   248
	VS(msg);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   249
	return rc;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   250
}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   251
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   252
__declspec(dllexport) int DllRegisterServerEx(LPCSTR fileName)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   253
{
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   254
	char msg[40];
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   255
	sprintf(msg, "DllRegisterServerEx from thread %x", GetCurrentThreadId()); 
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   256
	VS(msg);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   257
	if (gPythoncom == 0)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   258
		startUp();
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   259
	return Pyc_DllRegisterServerEx(fileName);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   260
}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   261
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   262
__declspec(dllexport) int DllUnregisterServerEx(LPCSTR fileName)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   263
{
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   264
	if (gPythoncom == 0)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   265
		startUp();
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   266
	return Pyc_DllUnregisterServerEx(fileName);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   267
}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   268
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   269
STDAPI DllRegisterServer()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   270
{
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   271
	int rc, pyrc;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   272
	if (gPythoncom == 0)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   273
		startUp();
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   274
	PyEval_AcquireThread(thisthread);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   275
	rc = callSimpleEntryPoint("DllRegisterServer", &pyrc);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   276
	PyEval_ReleaseThread(thisthread);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   277
	return rc==0 ? pyrc : SELFREG_E_CLASS;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   278
}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   279
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   280
STDAPI DllUnregisterServer()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   281
{
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   282
	int rc, pyrc;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   283
	if (gPythoncom == 0)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   284
		startUp();
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   285
	PyEval_AcquireThread(thisthread);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   286
	rc = callSimpleEntryPoint("DllUnregisterServer", &pyrc);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   287
	PyEval_ReleaseThread(thisthread);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   288
	return rc==0 ? pyrc : SELFREG_E_CLASS;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   289
}