2010-02-17 8 views
3

J'ai créé cette fonction pour appeler une fonction non gérée à partir du code C. pCallback est un pointeur de fonction, donc du côté géré est un délégué.Exception C# lors de l'appel de la fonction de rappel

[DllImport("MyDLL.dll")] 

public static extern Result SetCallback(
      IntPtr handle, 
      Delegate pCallback, 
      CallbackType Type); 

Maintenant, je suis en train

private delegate void pfnCallback(uint PromptID, ttsEventType evt, IntPtr lData); 
private pfnCallback cb = new pfnCallback(cback); 

public Form1() 
{ 

    (...) 
    Wrapper.SetCallback(handle, cb, IntPtr.Zero, CallBackType.DEFAULT); 
    (...) 
    public static void cback(uint PromptID, ttsEventType evt, IntPtr lData) 
    { } 
    } 

Lorsque le débogage, je vois qu'il exécute la fonction de cBACK une fois, puis je reçois une exception aucune donnée, juste en disant « Une exception non gérée win32 a eu lieu en WindowsApp2.vshost.exe [4372]. Je ne comprends pas quel est le problème. quelqu'un peut-il me aider?

Répondre

1

Essayez d'utiliser

[UnmanagedFunctionPointer(CallingConvention.xxx, CharSet = CharSet.xxx)] 
public delegate ... 
+0

Il a travaillé !!! Merci beaucoup! – jose

2

Essayez d'appeler Marshal.GetLastWin32Error() pour obtenir le code d'erreur Win32.

Puis comp sont le code d'erreur par rapport à cette liste: http://msdn.microsoft.com/en-us/library/ms681381(VS.85).aspx

Ce n'est toujours pas autant d'informations qu'un bon objet d'exception, mais cela pourrait vous orienter dans la bonne direction.

1

Vous devez vous assurer que votre référence au rappel n'est pas collectée par le Garbage Collector. La référence au rappel doit être active dans la mémoire gérée tant que le rappel doit être appelé.

Une façon de contourner cela est de créer une couche de C++ géré au milieu

2

Il n'y a pas beaucoup de détails ici, mais je pense cela peut être une question de convention d'appel. J'essaie toujours de définir explicitement la convention d'appel lors de l'utilisation de DllImport; La convention d'appel peut affecter la façon dont les paramètres sont placés sur la pile d'appels et comment ils sont nettoyés par la suite.

Voir here

Il faudrait trouver la convention correcte des en-têtes ou documents fournis avec votre bibliothèque non géré.

Questions connexes