Comment porter un header C avec des déclarations Inline + Fonction CALLBACK en C#
Bonjour,
J'ai a utiliser une librairie C/C++ écrites en utilisant les MFC (c'est donc relativement ancien) et je commence par réécrire le header dont j'ai besoin. Pour les constante classique en #define ca va. Je fais comme ceci:
Code:
1 2 3 4
|
// en C, j'ai ca: #define DB_NUMMASK 0x00ff
// en C# je fais ca:
public const uint DB_NUMMASK = 0x00ff; |
Donc ca se fait bien. En revanche lorsque j'ai des définition "inline" je ne peux pas mieux faire que de créer une fonction. Est-ce que il y a mieux ? Je fais comme ca:
J'ai ça dans le header C
Code:
1 2
|
#define DB_ATTR_NUM(attr) ((attr >> DB_NUMSHIFT) & DB_NUMMASK) |
J'ai cherché a savoir si on pouvais faire des définition en ligne en C# comme en C. C'est ma question.
En attendant j'ai fait comme ca, en créant des fonctions dans une classe (dans laquelle j'ai toutes mes constantes de header). Comme ca:
Code:
1 2 3 4 5
|
public long DB_ATTR_NUM( uint attr )
{
return ( (long) ((attr >> (int) DB_NUMSHIFT) & DB_NUMMASK) );
} |
Question: Est-ce que il y a mieux que de créer une fonction ? Autrement dit, peut-on faire en C# des déclarations inline comme en C ?
Merci.
Header C et fonctions CallBack en C#
Bonjour,
2 questions supplémentaires, toujours pour le portage d'un header C en C# et les fonction passées en paramètre (callback)
Première question:
Toujours dans la même idée, je voudrais convertir cette définition d'un header C en C#:
Code:
1 2
|
typedef long (*eventfunc_t) (long client_arg, long event_class, long event_type, long event_arg); |
J'ai pensé a ca:
Code:
1 2
|
using eventfunc_t = System.Int64; |
Mais je pense que c'est trop simple. C'était ma première question. Merci.
Seconde question :
En réalité la fonction eventfunc est une fonction qui est passée en paramètre d'une autre fonction de cette DLL écrite en C/MFC de Microsoft. Une fonction CallBack. Je ne sais pas bien faire, a vrais dire. Comment passer en paramètre, non pas une variable d'un type C# (int, String, etc.) mais une fonction de type eventfunc_t, défini plus haut ?
Pour donner plus de précision, la fonction de type "eventfunc " est défini comme ca dans un exemple dans la documentation de la DLL:
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
extern C {
long eventfunc ( long arg, long evclass, long evtype, long evarg)
{
if (evtype == EVENT_LOGOUT) {
// traitement et action sur interception d'un évènement LogOut
// action, ToDo
return;
}
}
} |
Comment porter en C# la fonction juste au dessus ? long eventfunc (long arg, long evclass, long evtype, long evard) ? et pour le extern C ? Merci.
La fonction qui prends en argument la fonction de type est la suivante en C:
Code:
1 2
|
HSESS far pascal dbSessLoginServer(HWND cons_wnd, char *ipAddr, char *user, char *passwd, eventfunc_t func, long client_arg); |
Où HSESS est un type définie égale à *void en C c'est a dire un System.IntPtr en C#. Pas de problème de ce coté là. ON reconnaît le type "eventfunc_t" défini plus haut et "func" la fonction passé en paramètre.
Est-ce que cela suffit ? Faut-il utiliser la notion de "Delegate" en C# (j'ai fait quelques recherches sur Google sur les fonctions callback en C#, sans vraiment comprendre ce que j'ai lu) ?