Do not have the launcher executables depend on the CRT

This commit is contained in:
Kovid Goyal 2015-12-11 00:23:48 +05:30
parent f8560f79fc
commit 897a1a137e
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 23 additions and 28 deletions

View File

@ -606,16 +606,16 @@ class Win32Freeze(Command, WixMixIn):
subsys = 'WINDOWS' if typ == 'gui' else 'CONSOLE'
for mod, bname, func in zip(modules[typ], basenames[typ],
functions[typ]):
xflags = list(cflags) + ['/MT']
cflags = '/c /EHsc /MT /W3 /O1 /nologo /D_UNICODE /DUNICODE /GS-'.split()
if typ == 'gui':
xflags += ['/DGUI_APP=']
cflags += ['/DGUI_APP=']
xflags += ['/DMODULE="%s"'%mod, '/DBASENAME="%s"'%bname,
cflags += ['/DMODULE="%s"'%mod, '/DBASENAME="%s"'%bname,
'/DFUNCTION="%s"'%func]
dest = self.j(self.obj_dir, bname+'.obj')
if self.newer(dest, [src]):
if self.newer(dest, [src, __file__]):
self.info('Compiling', bname)
cmd = [msvc.cc] + xflags + dflags + ['/Tc'+src, '/Fo'+dest]
cmd = [msvc.cc] + cflags + dflags + ['/Tc'+src, '/Fo'+dest]
self.run_builder(cmd)
exe = self.j(self.base, bname+'.exe')
lib = dll.replace('.dll', '.lib')
@ -625,10 +625,11 @@ class Win32Freeze(Command, WixMixIn):
mf = dest + '.manifest'
with open(mf, 'wb') as f:
f.write(EXE_MANIFEST)
cmd = [msvc.linker] + ['/MACHINE:'+machine, '/LTCG',
cmd = [msvc.linker] + ['/MACHINE:'+machine, '/NODEFAULTLIB', '/ENTRY:start_here',
'/LIBPATH:'+self.obj_dir, '/SUBSYSTEM:'+subsys,
'/LIBPATH:%s/libs'%self.python_base, '/RELEASE',
'/MANIFEST:EMBED', '/MANIFESTINPUT:' + mf,
'user32.lib', 'kernel32.lib',
'/OUT:'+exe] + u32 + dlflags + [self.embed_resources(exe),
dest, lib]
self.run_builder(cmd)

View File

@ -7,7 +7,7 @@
#include<windows.h>
#include<strsafe.h>
size_t mystrlen(const wchar_t *buf) {
static size_t mystrlen(const wchar_t *buf) {
size_t ans = 0;
if (FAILED(StringCbLengthW(buf, 500, &ans))) return 0;
return ans;
@ -23,15 +23,13 @@ static int show_error(const wchar_t *preamble, const wchar_t *msg, const int cod
}
MessageBeep(MB_ICONERROR);
if (FAILED(StringCbPrintfW(buf, LocalSize(buf), L"%s\r\n %s (Error Code: %d)\r\n", preamble, msg, code)))
MessageBox(NULL, preamble, NULL, MB_OK|MB_ICONERROR);
else
MessageBox(NULL, buf, NULL, MB_OK|MB_ICONERROR);
wsprintf(buf, L"%s\r\n %s (Error Code: %d)\r\n", preamble, msg, code);
MessageBox(NULL, buf, NULL, MB_OK|MB_ICONERROR);
LocalFree(buf);
return code;
}
int show_last_error(wchar_t *preamble) {
static int show_last_error(wchar_t *preamble) {
wchar_t *msg = NULL;
DWORD dw = GetLastError();
int ret;
@ -55,11 +53,12 @@ int show_last_error(wchar_t *preamble) {
typedef int (__cdecl *ENTRYPROC)(const char*, const char*, const char*, int);
static ENTRYPROC load_launcher_dll() {
wchar_t buf[MAX_PATH] = {0};
wchar_t buf[MAX_PATH]; // Cannot use a zero initializer for the array as it generates an implicit call to memset()
wchar_t drive[4] = L"\0\0\0";
DWORD sz;
HMODULE dll;
ENTRYPROC entrypoint;
int i = 0;
DWORD sz = 0;
HMODULE dll = 0;
ENTRYPROC entrypoint = 0;
if ((sz = GetModuleFileNameW(NULL, buf, MAX_PATH)) >= MAX_PATH - 30)
ExitProcess(show_error(L"Installation directory path too long", L"", 1));
@ -84,19 +83,14 @@ static ENTRYPROC load_launcher_dll() {
return entrypoint;
}
int __stdcall start_here() {
int ret = 0;
#ifdef GUI_APP
int WINAPI
wWinMain(HINSTANCE Inst, HINSTANCE PrevInst, wchar_t *CmdLine, int CmdShow) {
// This should really be returning the value set in the WM_QUIT message, but I cannot be bothered figuring out how to get that.
load_launcher_dll()(BASENAME, MODULE, FUNCTION, 1);
return 0; // This should really be returning the value set in the WM_QUIT message, but I cannot be bothered figuring out how to get that.
}
#else
int wmain(int argc, wchar_t *argv) {
return load_launcher_dll()(BASENAME, MODULE, FUNCTION, 0);
}
ret = load_launcher_dll()(BASENAME, MODULE, FUNCTION, 0);
#endif
ExitProcess(ret);
return ret;
}