- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在对一个应用程序进行子类化。我的子类 Window 过程在一个 DLL 中。我在 DLL 中的子类化代码看起来有点像这样(精简,删除了其他不相关的部分)。
class FooBar
{
private delegate int WndProcDelegateType(IntPtr hWnd, int uMsg,
int wParam, int lParam);
private const int GWL_WNDPROC = (-4);
private static IntPtr oldWndProc = IntPtr.Zero;
private static WndProcDelegateType newWndProc = new
WndProcDelegateType(MyWndProc);
internal static bool bHooked = false;
[DllImport("user32.dll")]
private static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex,
WndProcDelegateType dwNewLong);
[DllImport("user32.dll")]
private static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex,
IntPtr dwNewLong);
[DllImport("user32")]
private static extern int CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd,
int Msg, int wParam, int lParam);
private static int MyWndProc(IntPtr lhWnd, int Msg, int wParam, int lParam)
{
switch (Msg)
{
// the usual stuff
// finally
return CallWindowProc(oldWndProc, lhWnd, Msg, wParam, lParam);
}
internal static void Hook()
{
oldWndProc = SetWindowLong(hWnd, GWL_WNDPROC, MyWndProc);
bHooked = oldWndProc != IntPtr.Zero;
}
internal static void Unhook()
{
if (bHooked) SetWindowLong(hWnd, GWL_WNDPROC, oldWndProc);
}
}
现在,即使我在委托(delegate)的类级静态实例变量中持有对 WndProc 的强引用,我也会收到此错误。
CallbackOnCollectedDelegate was detected
Message: A callback was made on agarbage collected delegate of type'PowerPointAddIn1!FooBar+WndProcDelegateType::Invoke'.This may cause application crashes,corruption and data loss. When passingdelegates to unmanaged code, they must be keptalive by the managed application untilit is guaranteed that they will neverbe called.
我做错了什么?
最佳答案
oldWndProc = SetWindowLong(hWnd, GWL_WNDPROC, MyWndProc);
这会强制 C# 即时创建委托(delegate)对象。它将代码翻译成这样:
oldWndProc = SetWindowLong(hWnd, GWL_WNDPROC, new WndProcDelegateType(MyWndProc));
这是一个问题,该委托(delegate)对象未在任何地方被引用。下一次垃圾收集将销毁它,从非托管代码下面拉出地毯。你已经在你的代码中做了正确的事情,你只是忘记了使用它。修复:
oldWndProc = SetWindowLong(hWnd, GWL_WNDPROC, newWndProc);
顺便说一句,从 NativeWindow 派生您自己的类并使用其 AssignHandle() 方法是更好的捕鼠器。当您看到 WM_DESTROY 消息时调用 ReleaseHandle()。
关于c# - 检测到 CallbackOnCollectedDelegate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4855513/
我正在尝试诊断我们目前无法在调试环境中重现的客户端崩溃。 我正在尝试确定如果未附加调试器,CallbackOnCollectedDelegate MDA 通知(由第三方代码产生)是否会导致崩溃。 因此
在我的代码运行 5-10 分钟后,我不断收到此错误 CallbackOnCollectedDelegate was detected Message: A callback was made on a
我正在对一个应用程序进行子类化。我的子类 Window 过程在一个 DLL 中。我在 DLL 中的子类化代码看起来有点像这样(精简,删除了其他不相关的部分)。 class FooBar { pri
我正在使用此代码 GlobalKeyboardHook.cs钩住键盘。 我已经按照 this post 中的说明更改了所有指定内容.现在我的代码如下所示: using System; using Sy
我尝试使用 TensorFlowSharp 构建一个小的 tensorflow 应用程序,有时我会收到此异常: Managed Debugging Assistant 'CallbackOnColle
我正在使用全局键盘 Hook 类。此类允许检查是否在任何地方按下了键盘键。一段时间后我遇到了一个错误: **CallbackOnCollectedDelegate was detect
我正在尝试为 Walther Mfs100 Check 扫描仪编写接口(interface),但扫描后出现“检测到 CallbackOnCollectedDelegate”错误。我怎样才能解决这个问题
我制作了一个非常小的应用程序,可以使用 SlimDX 捕获游戏内的屏幕。(我按下左键点击捕捉) 捕获有效(至少当我点击表单本身时)但是当我点击 firefox 或任何其他应用程序时,我得到这个异常:
我是一名优秀的程序员,十分优秀!