Maison  >  Article  >  tutoriels informatiques  >  Comment appeler la fonction de rappel dans une DLL imbriquée ?

Comment appeler la fonction de rappel dans une DLL imbriquée ?

WBOY
WBOYavant
2024-01-20 08:27:161014parcourir

Comment appeler la fonction de rappel dans une DLL imbriquée ?

Comment appeler la fonction de rappel dans une DLL imbriquée

HMODULE hModelHand = LoadLibrary(__T("MyDLL.DLL"));

SetLog pLogShowFun = (SetLog)GetProcAddress(hModelHand, MYTESTFUN);

{if (NULL == pLogShowFun)

AfxMessageBox(__T("obtenir une erreur d'adresse mydll.dll !"));

}

pLogShowFun((writeLog *)(Mylog::writelog));1234567891011

Opération en DLL

#define MyDLL_API extern "C" __declspec( dllexport )

typedef void(*writeLog)(const char *plogFile, int p_nType, const char *logText);

writeLog g_RunLog = NULL;

MyDLL_API annule mytestfun(void *pfun)

{ si (pfun)

{

g_RunLog = (writeLog)pfun;

}

}

Expliquez comment implémenter la fonction de rappel C

Qu'est-ce qu'une fonction de rappel C# ? La fonction de rappel C# est une fonction fournie par l'application pour être appelée par la DLL système Windows ou une autre DLL. Elle est généralement utilisée pour intercepter des messages, obtenir des informations système ou gérer des événements asynchrones. L'application indique à la DLL le pointeur d'adresse de la fonction de rappel et la DLL appelle la fonction au moment approprié. La fonction de rappel doit être conforme au format de paramètre et à la méthode de transfert prédéfinis, sinon le programme ou le système plantera dès que la DLL l'appellera. Normalement, la fonction de rappel utilise la méthode d'appel standard de l'API Windows, c'est-à-dire __stdcall. Bien sûr, le compilateur DLL peut définir lui-même la méthode d'appel, mais le programme client doit également se conformer aux mêmes réglementations. En mode __stdcall, les paramètres de la fonction sont poussés sur la pile dans l'ordre de droite à gauche. À moins qu'ils ne soient explicitement signalés comme pointeurs ou références, les paramètres sont passés par valeur. Vous êtes responsable de l'extraction des paramètres de la pile. avant le retour de la fonction. Comprenez les fonctions de rappel C# ! Lorsqu'un programme appelle une fonction (généralement appelée api), cela équivaut au programme appelant une fonction. La relation s'exprime comme suit : call

.

programme--------------------→dll

Lorsqu'un programme appelle une fonction, il transmet l'adresse de sa propre fonction en tant que paramètre à la fonction appelée par le programme (sa propre fonction est alors appelée fonction de rappel. Les fonctions DLL qui nécessitent des fonctions de rappel sont souvent celles qui doivent être exécutées). certaines opérations à plusieurs reprises. La fonction et la relation s'expriment comme suit : appeler (appeler)

callback (callback) Lorsque la fonction que vous appelez transmet la valeur de retour à la fonction de rappel, vous pouvez utiliser la fonction de rappel pour traiter ou terminer certaines opérations. Quant à la manière de définir votre propre fonction de rappel, cela dépend de la fonction API spécifique utilisée. De nombreux types différents de fonctions de rappel ont différents paramètres. Les descriptions de ces paramètres sont généralement décrites dans l'aide, telles que les paramètres et les valeurs de retour de. la fonction de rappel. En fait, pour faire simple, la fonction de rappel est appelée par la DLL une fois que la fonction que vous avez écrite remplit certaines conditions ! Il existe également un dicton (qui est plus facile à comprendre) : la fonction de rappel est comme une fonction de traitement d'interruption, qui est automatiquement appelée par le système lorsque les conditions que vous avez définies sont remplies. Voici l'exemple de code : WorkClass.cs : usingSystem; namespaceCallBackSample ...{ publicdelegatestringShowMessage(stringmessage); internalclassWorkClass ...{ publicvoidDoWork(stringmessage) ...{ ShowMessageshowMessage=newShowMessage(showCoolMessage+=showTerribleMessage="; "; foreach(ShowMessageshinshowMessage.GetInvocationList()) ...{ result+=sh(message); } Console.Write(result); Console.Read(); } privatestringshowCoolMessage(stringmessage) ...{ strings=message+"Cool ! "; renvoie; } privatestringshowTerribleMessage(stringmessage) ...{ strings=message+"Terrible!"; renvoie; } } } program.cs: namespaceCallBackSample ...{ classProgram ...{ staticvoidMain(string[]args) ... { WorkClassworkClass =newWorkClass(); workClass.DoWork("Basketball" } } }

;

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer