Je pense que j'ai fondamentalement compris comment écrire des délégués C# pour les rappels, mais celui-ci me déroute. Le C++ définition est la suivante:Délégué C# pour le rappel C++
typedef int (__stdcall* Callback)(
long lCode,
long lParamSize,
void* pParam
);
et mon approche C# serait:
unsafe delegate int CallbackDelegate (int lCode, int lParamSize, IntPtr pParam);
Bien que cela semble être incorrect, parce que je reçois une erreur PInvokeStackInbalance, ce qui signifie que ma définition du délégué est faux.
Le reste des paramètres de la fonction sont des chaînes ou des ints, ce qui signifie qu'ils ne peuvent pas causer l'erreur, et si je viens de passer un IntPtr.Zero au lieu du délégué (ce qui signifierait que je pointe vers un non- fonction de rappel existante) Je reçois une erreur AccessViolation, ce qui est également logique.
Qu'est-ce que je fais mal?
EDIT:
La fonction complète C++ est:
int
__stdcall
_Initialize (
const char* FileName,
Callback cbFunction,
int Code,
const char* Name,
unsigned int Option,
unsigned int Option2
);
Ma version C# est:
[DllImport("MyDll.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int _Initialize (string FileName, CallbackDelegate cbFunction, int Code, string Name, uint Options, uint Options2);
La fonction est (pour le test) vient d'appeler à l'intérieur de la routine principale une application de console:
static void Main(string[] args)
{
CallbackDelegate del = new CallbackDelegate(onCallback);
Console.Write(_Initialize("SomeFile.dat", del, 1000, "", 0, 4));
Console.Read();
}
où onCallback
est la suivante:
static int onCallback(int lCode, int lParamSize, IntPtr pParam)
{
return 0;
}
Je reçois l'erreur PInvokeStackInbalance
sur la ligne où j'appelle _Initialize
, si je passe un IntPtr.Zero
au lieu du délégué et de modifier la définition de la fonction à IntPtr
au lieu de CallbackDelegate
puis Je reçois un AccessViolationException
.
'Le reste des paramètres de la fonction sont cordes ou ints'. Ne cachez pas les informations. –
Avez-vous essayé de ne pas utiliser dangereux? i.e: délégué int CallbackDelegate (int lCode, int lParamSize, IntPtr pParam); – DougEC
@HansPassant Je n'essaie pas de cacher des informations, j'essayais de laisser de côté des choses que je considérais comme non pertinentes. Je vais modifier la question et ajouter les informations. – Valandur