Мой Icon Handler вылетает Explorer

У меня есть проект, использующий SharpShell для Icon Handler. Он заглядывает внутрь APK, чтобы найти и отобразить их значок. У меня это работает, но есть несколько побочных эффектов. Если я попытаюсь переименовать APK во что-то другое, скажем, из A.apk в B.apk, то исследователь падает, и я не могу найти причину, почему.

Вот основной раздел и биты регистрации:

using System;
using System.Drawing;
using System.IO;
using System.Runtime.InteropServices;
using ApkDetails;
using SharpShell.Attributes;
using SharpShell.SharpIconHandler;

namespace ApkIconHandler {
    [ComVisible(true)]
    [COMServerAssociation(AssociationType.ClassOfExtension, ".apk")]
    public class ApkHandler : SharpIconHandler {
        protected override Icon GetIcon(bool smallIcon, uint iconSize) {
            try {
                APK apk = new APK(SelectedItemPath);
                using (Bitmap icon = apk.GetIcon()) {
                    IntPtr icH = icon.GetHicon();
                    Icon ico = Icon.FromHandle(icH);
                    return ico;
                }
            } catch (Exception ex) {
                File.AppendAllText(@"C:\APKError.txt", ex.Message + Environment.NewLine + ex.StackTrace);
                return Icons.DefaultIcon;
            }
        }

        protected override void LogError(string message, Exception exception = null) {
            base.LogError(message, exception);
            String err = message;
            if (exception != null) err += Environment.NewLine + exception.StackTrace;
            File.AppendAllText(@"C:\APKError.txt", err + Environment.NewLine);
        }

        protected override void Log(string message) {
            base.Log(message);
            File.AppendAllText(@"C:\APKLog.txt", message + Environment.NewLine);
        }
    }
}

Мой код APK работает aapt d badging "path.apk" и анализирует выходные данные, чтобы получить информацию о значках, и GetIcon открывает APK в виде zip-файла, чтобы получить этот файл. Я обертываю все это в try/catch и связываю с методом SharpShell LogError, но я никогда не получаю никакого вывода. Я отключил UAC. Я не думаю, что есть проблема с правами на запись в корень диска, потому что APKLog.txt обнаруживается, но без полезной информации.

Я получаю окно "Проводник Windows перестал работать", в котором эта информация отображается как "Подпись проблемы".

  Problem Event Name:   CLR20r3
  Problem Signature 01: explorer.exe
  Problem Signature 02: 6.1.7601.17567
  Problem Signature 03: 4d672ee4
  Problem Signature 04: mscorlib
  Problem Signature 05: 4.0.30319.18047
  Problem Signature 06: 5155314f
  Problem Signature 07: 326
  Problem Signature 08: 5d
  Problem Signature 09: System.AccessViolationException
  OS Version:   6.1.7601.2.1.0.256.48
  Locale ID:    1033
  Additional Information 1: 59cf
  Additional Information 2: 59cf5fdf81b829ceb8b613f1f092df60
  Additional Information 3: 6d90
  Additional Information 4: 6d903bfb0ab1d4b858654f0b33b94d7f

Я вижу, что это говорит System.AccessViolationException но никто из моего кода не уловил этого. Может кто-нибудь предложить немного понимания того, что здесь происходит?

1 ответ

Могу ли я порекомендовать убедиться, что вы создали сервер в режиме отладки, а затем запустить инструмент "Диспетчер серверов" из sharpshell. Как только вы это сделаете, включите ведение журнала из меню инструментов. Начиная с этого момента, всякий раз, когда код sharpshell перехватывает исключение, которое могло быть сгенерировано из вашего кода, он заносит его в журнал событий.

Вы можете использовать LogMessage и LogError на своем собственном сервере SharpShell для записи сообщений или ошибок в журнал событий, это облегчит диагностику происходящего!

Другие вопросы по тегам