estoy de subclases de una aplicación. Mi procedimiento de ventana subclasificado está dentro de una DLL. Mi código de subclases dentro de la DLL se parece a esto (desmantelado, eliminado otras partes no relacionadas).CallbackOnCollectedDelegate se detectó
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, newWndProc);
bHooked = oldWndProc != IntPtr.Zero;
}
internal static void Unhook()
{
if (bHooked) SetWindowLong(hWnd, GWL_WNDPROC, oldWndProc);
}
}
Ahora, a pesar de que estoy sosteniendo una fuerte referencia a la WndProc en una instancia estática variable de nivel de clase del delegado, me sale este error.
CallbackOnCollectedDelegate se detectó
Mensaje: Una devolución de llamada se hizo en un delegado recogida de basura de tipo 'PowerPointAddIn1 FooBar + WndProcDelegateType :: Invoke!'. Esto puede causar bloqueos en la aplicación, corrupción y pérdida de datos. Al pasar delegados a código no administrado, hay que mantenerlos vivos por la aplicación administrada hasta se garantiza que nunca van a ser llamados .
¿Qué estoy haciendo mal?
Gracias por su ayuda. Su respuesta es correcta pero aún así obtener la excepción. Me siento mucho que he publicado el código incorrecto. yo ya había hecho que el cambio antes de publicar esta pregunta. yo tenía el código en dos lugares y publicado el código anterior, que yo no había cambiado. todavía consigo la excepción. –
Eh, ¿qué se supone que debo mirar? –
@Hans:. en este momento, no he tenido que he dejado algo inexplicable –