diff --git a/src/calibre/gui2/open_with.py b/src/calibre/gui2/open_with.py index 4791737550..4b290df57c 100644 --- a/src/calibre/gui2/open_with.py +++ b/src/calibre/gui2/open_with.py @@ -73,13 +73,23 @@ if iswindows: return sort_key(entry.get('name') or '') def finalize_entry(entry): - data = load_icon_resource(entry.pop('icon_resource', None), as_data=True) + try: + data = load_icon_resource(entry.pop('icon_resource', None), as_data=True) + except Exception: + data = None + import traceback + traceback.print_exc() if data: entry['icon_data'] = data return entry def entry_to_item(entry, parent): - icon = load_icon_resource(entry.get('icon_resource')) + try: + icon = load_icon_resource(entry.get('icon_resource')) + except Exception: + icon = None + import traceback + traceback.print_exc() if not icon: icon = entry_to_icon_text(entry)[0] ans = QListWidgetItem(QIcon(icon), entry.get('name') or _('Unknown'), parent) diff --git a/src/calibre/utils/open_with/windows.py b/src/calibre/utils/open_with/windows.py index 532483c559..3435945976 100644 --- a/src/calibre/utils/open_with/windows.py +++ b/src/calibre/utils/open_with/windows.py @@ -11,9 +11,12 @@ from collections import namedtuple from future_builtins import map from PyQt5.Qt import QtWin, Qt, QIcon, QByteArray, QBuffer, QPixmap -import win32con, win32api, win32gui +import win32con, win32api, win32gui, pywintypes, winerror +from calibre import prints from calibre.gui2 import must_use_qt +from calibre.utils.winreg.default_programs import split_commandline + ICON_SIZE = 64 def hicon_to_pixmap(hicon): @@ -33,7 +36,13 @@ def copy_to_size(pixmap, size=ICON_SIZE): def simple_load_icon(module, index, as_data=False, size=ICON_SIZE): ' Use the win32 API ExtractIcon to load the icon. This restricts icon size to 32x32, but has less chance of failing ' - large_icons, small_icons = win32gui.ExtractIconEx(module, index, 10) + try: + large_icons, small_icons = win32gui.ExtractIconEx(module, index, 10) + except pywintypes.error as err: + if err.winerror != winerror.ERROR_FILE_NOT_FOUND: + raise + prints('File %r does not exist, cannot load icon' % module) + return icons = large_icons + small_icons try: if icons: @@ -104,6 +113,8 @@ def load_icon_resource(icon_resource, as_data=False, size=ICON_SIZE): return module, index = parts index = int(index) + if module.startswith('"') and module.endswith('"'): + module = split_commandline(module)[0] try: return load_icon(module, index, as_data=as_data, size=size) except Exception: