Winapi 从Excel XLL创建小型转储

Winapi 从Excel XLL创建小型转储,winapi,dll,crash,Winapi,Dll,Crash,我有一个Excel XLL加载项,它会在某些计算机上崩溃Excel。 为了排除故障,我在DllMain中添加了此调用: SetUnhandledExceptionFilter(MyExceptionFilter); 以及过滤器本身: LONG WINAPI MyExceptionFilter(struct _EXCEPTION_POINTERS *lpTopLevelExceptionFilter) 但过滤器在崩溃时永远不会被调用。这是一个老问题,但只是为了以防万一,这可以帮助其他人:设计不

我有一个Excel XLL加载项,它会在某些计算机上崩溃Excel。 为了排除故障,我在
DllMain
中添加了此调用:

SetUnhandledExceptionFilter(MyExceptionFilter);
以及过滤器本身:

LONG WINAPI MyExceptionFilter(struct _EXCEPTION_POINTERS *lpTopLevelExceptionFilter)

但过滤器在崩溃时永远不会被调用。

这是一个老问题,但只是为了以防万一,这可以帮助其他人:设计不支持在XLLs中使用
SetUnhandledExceptionFilter()
,引用微软员工王杰的话

你观察到的行为是故意的

第三方加载项/DLL无法为Office设置未处理的异常筛选器 2007应用程序(至少不以受支持的方式)。MSO.DLL显式设置 过滤自身,然后覆盖API以防止第三方更改 MSO设置后的过滤器。这对于所有Office应用程序都是通用的(不是 仅限Outlook)

因此,官方唯一支持的从Excel获取崩溃转储的方法是使用


实际上,使用MSVC特有的
\u set\u se\u translator()
函数确实有效。但它必须从所有应用程序线程调用,这与进程global
SetUnhandledExceptionFilter()

不同,Excel可能会在某个地方覆盖它本身-也许您可以使用
OutputDebugString()
来获取一些诊断信息,以查看
DebugView
或类似的内容?我正在做一个类似示例中的补丁,好的,但是,如果Excel在加载XLL之前做了同样的事情呢?我不知道是否有,但这可能是你的过滤器没有被调用的原因之一。谢谢你的回答。但不幸的是,即使是“set_se_”翻译程序也不能为我的Excel工作。addin.FWIW我不需要做任何特殊的事情来让它工作。但Excel版本、平台、32位和64位可能会有所不同,所以它可能不适用于所有这些组合。我在Excel 2013上进行了测试。32位。你的设置是什么?我想我也用2013进行了测试。我确实用2010进行了测试,那是当时我的客户使用最广泛的版本。32位。/EHa标志和我尝试的错误都是通过空指针寻址的,就像这样((int)0)=0;