我有一个使用SharpShell作为图标处理程序的项目。它会偷看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
,但我的代码都没有抓住它。有人可以对这里发生的事情提供一些见解吗?
答案 0 :(得分:0)
我是否可以建议您确保已在调试模式下构建服务器,然后从sharpshell运行“服务器管理器”工具。完成后,从工具菜单启用日志记录。从现在开始,每当sharpshell代码捕获可能从您的代码抛出的异常时,它都会将其记录到事件日志中。
您可以在自己的SharpShell服务器中使用LogMessage和LogError将消息或错误写入事件日志,这样可以更容易地诊断正在发生的事情!