在Mpeg2DecFilter.cpp
中,存在以下代码:
#include "detours.h"
DETOUR_TRAMPOLINE(BOOL WINAPI Real_IsDebuggerPresent(), IsDebuggerPresent);
BOOL WINAPI Mine_IsDebuggerPresent()
{
TRACE(_T("Oops, somebody was trying to be naughty! (called IsDebuggerPresent)\n"));
return FALSE;
}
...snip...
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
if(!fDetourInited)
{
DetourFunctionWithTrampoline((PBYTE)Real_IsDebuggerPresent, (PBYTE)Mine_IsDebuggerPresent);
...snip...
fDetourInited = true;
}
return DllEntryPoint((HINSTANCE)hModule, ul_reason_for_call, 0); // "DllMain" of the dshow baseclasses;
}
我不能为我的生活找出为什么Gplmpgdec会覆盖IsDebuggerPresent
以永远返回FALSE
。这有什么用呢?
问题是,对我来说,由于调试器消息没有显示而导致问题,并且(有时)如果在卸载Gplmpgdec DLL时写入跟踪消息,应用程序将崩溃。
为了决定如何处理这个问题,我想我真的需要知道为什么Gplmpgdec会这样做。有关解决方案的任何建议也欢迎。我宁愿不必维护我自己的自定义Gplmpgdec库;这种维护头痛我宁愿不惜一切代价避免。有没有办法禁用绕行?
答案 0 :(得分:0)
当存在调试器时,某些DirectShow过滤器实际上无法正常工作。
我不确定这是Gplmpgdec的解决方法,还是与其他钩子函数有关; ChangeDisplaySettingsEx
。您可以在代码中清楚地看到对Macrovision的引用,他们可能会尝试禁用它们。
Media Player Classic / MPC-HC使用相同类型的代码,它在.exe中更有意义,然后在解码器库中。
答案 1 :(得分:0)
我也很惊讶在一个开源项目中看到此代码。
我认为这只是开发者的笑话。如果您看到该消息
糟糕,有人试图调皮!
对我来说,这是第二学位,也许开发人员刚刚发现了IsDebuggerPresent,并发现使用它很有趣...
我还记得在编写此编解码器时,某些视频编解码器阻止了DirectShow应用程序的调试(使用filtergraph)。也许这位开发商来自这些公司之一...
要解决此问题,您只需注释此代码,然后重新编译即可。