mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Do not have the launcher executables depend on the CRT
This commit is contained in:
parent
f8560f79fc
commit
897a1a137e
@ -606,16 +606,16 @@ class Win32Freeze(Command, WixMixIn):
|
|||||||
subsys = 'WINDOWS' if typ == 'gui' else 'CONSOLE'
|
subsys = 'WINDOWS' if typ == 'gui' else 'CONSOLE'
|
||||||
for mod, bname, func in zip(modules[typ], basenames[typ],
|
for mod, bname, func in zip(modules[typ], basenames[typ],
|
||||||
functions[typ]):
|
functions[typ]):
|
||||||
xflags = list(cflags) + ['/MT']
|
cflags = '/c /EHsc /MT /W3 /O1 /nologo /D_UNICODE /DUNICODE /GS-'.split()
|
||||||
if typ == 'gui':
|
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]
|
'/DFUNCTION="%s"'%func]
|
||||||
dest = self.j(self.obj_dir, bname+'.obj')
|
dest = self.j(self.obj_dir, bname+'.obj')
|
||||||
if self.newer(dest, [src]):
|
if self.newer(dest, [src, __file__]):
|
||||||
self.info('Compiling', bname)
|
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)
|
self.run_builder(cmd)
|
||||||
exe = self.j(self.base, bname+'.exe')
|
exe = self.j(self.base, bname+'.exe')
|
||||||
lib = dll.replace('.dll', '.lib')
|
lib = dll.replace('.dll', '.lib')
|
||||||
@ -625,10 +625,11 @@ class Win32Freeze(Command, WixMixIn):
|
|||||||
mf = dest + '.manifest'
|
mf = dest + '.manifest'
|
||||||
with open(mf, 'wb') as f:
|
with open(mf, 'wb') as f:
|
||||||
f.write(EXE_MANIFEST)
|
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:'+self.obj_dir, '/SUBSYSTEM:'+subsys,
|
||||||
'/LIBPATH:%s/libs'%self.python_base, '/RELEASE',
|
'/LIBPATH:%s/libs'%self.python_base, '/RELEASE',
|
||||||
'/MANIFEST:EMBED', '/MANIFESTINPUT:' + mf,
|
'/MANIFEST:EMBED', '/MANIFESTINPUT:' + mf,
|
||||||
|
'user32.lib', 'kernel32.lib',
|
||||||
'/OUT:'+exe] + u32 + dlflags + [self.embed_resources(exe),
|
'/OUT:'+exe] + u32 + dlflags + [self.embed_resources(exe),
|
||||||
dest, lib]
|
dest, lib]
|
||||||
self.run_builder(cmd)
|
self.run_builder(cmd)
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include<windows.h>
|
#include<windows.h>
|
||||||
#include<strsafe.h>
|
#include<strsafe.h>
|
||||||
|
|
||||||
size_t mystrlen(const wchar_t *buf) {
|
static size_t mystrlen(const wchar_t *buf) {
|
||||||
size_t ans = 0;
|
size_t ans = 0;
|
||||||
if (FAILED(StringCbLengthW(buf, 500, &ans))) return 0;
|
if (FAILED(StringCbLengthW(buf, 500, &ans))) return 0;
|
||||||
return ans;
|
return ans;
|
||||||
@ -23,15 +23,13 @@ static int show_error(const wchar_t *preamble, const wchar_t *msg, const int cod
|
|||||||
}
|
}
|
||||||
|
|
||||||
MessageBeep(MB_ICONERROR);
|
MessageBeep(MB_ICONERROR);
|
||||||
if (FAILED(StringCbPrintfW(buf, LocalSize(buf), L"%s\r\n %s (Error Code: %d)\r\n", preamble, msg, code)))
|
wsprintf(buf, L"%s\r\n %s (Error Code: %d)\r\n", preamble, msg, code);
|
||||||
MessageBox(NULL, preamble, NULL, MB_OK|MB_ICONERROR);
|
MessageBox(NULL, buf, NULL, MB_OK|MB_ICONERROR);
|
||||||
else
|
|
||||||
MessageBox(NULL, buf, NULL, MB_OK|MB_ICONERROR);
|
|
||||||
LocalFree(buf);
|
LocalFree(buf);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int show_last_error(wchar_t *preamble) {
|
static int show_last_error(wchar_t *preamble) {
|
||||||
wchar_t *msg = NULL;
|
wchar_t *msg = NULL;
|
||||||
DWORD dw = GetLastError();
|
DWORD dw = GetLastError();
|
||||||
int ret;
|
int ret;
|
||||||
@ -55,11 +53,12 @@ int show_last_error(wchar_t *preamble) {
|
|||||||
typedef int (__cdecl *ENTRYPROC)(const char*, const char*, const char*, int);
|
typedef int (__cdecl *ENTRYPROC)(const char*, const char*, const char*, int);
|
||||||
|
|
||||||
static ENTRYPROC load_launcher_dll() {
|
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";
|
wchar_t drive[4] = L"\0\0\0";
|
||||||
DWORD sz;
|
int i = 0;
|
||||||
HMODULE dll;
|
DWORD sz = 0;
|
||||||
ENTRYPROC entrypoint;
|
HMODULE dll = 0;
|
||||||
|
ENTRYPROC entrypoint = 0;
|
||||||
|
|
||||||
if ((sz = GetModuleFileNameW(NULL, buf, MAX_PATH)) >= MAX_PATH - 30)
|
if ((sz = GetModuleFileNameW(NULL, buf, MAX_PATH)) >= MAX_PATH - 30)
|
||||||
ExitProcess(show_error(L"Installation directory path too long", L"", 1));
|
ExitProcess(show_error(L"Installation directory path too long", L"", 1));
|
||||||
@ -84,19 +83,14 @@ static ENTRYPROC load_launcher_dll() {
|
|||||||
return entrypoint;
|
return entrypoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int __stdcall start_here() {
|
||||||
|
int ret = 0;
|
||||||
#ifdef GUI_APP
|
#ifdef GUI_APP
|
||||||
|
// This should really be returning the value set in the WM_QUIT message, but I cannot be bothered figuring out how to get that.
|
||||||
int WINAPI
|
|
||||||
wWinMain(HINSTANCE Inst, HINSTANCE PrevInst, wchar_t *CmdLine, int CmdShow) {
|
|
||||||
load_launcher_dll()(BASENAME, MODULE, FUNCTION, 1);
|
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
|
#else
|
||||||
|
ret = load_launcher_dll()(BASENAME, MODULE, FUNCTION, 0);
|
||||||
int wmain(int argc, wchar_t *argv) {
|
|
||||||
return load_launcher_dll()(BASENAME, MODULE, FUNCTION, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
ExitProcess(ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user