Passage du handle de ma fenêtre à une fonction externe en C.

jchoplin Messages postés 12 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 16 mars 2006 - 10 mars 2006 à 10:20
jchoplin Messages postés 12 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 16 mars 2006 - 14 mars 2006 à 16:38
Bonjour,
je commence vraiment à désespérer vraiment, donc si quelqu'un pouvait m'aider, je suis vraiment preneur. Je cherche à utiliser une librairie écrite en C avec mon programme qui est en C#. Le problème est que la fonction que je désire utiliser doit recevoir un pointeur vers ma fenêtre et pouvoir lire ou écrire sur ma fenêtre. Mais lorsque je passe le handle de ma fenêtre en paramètre, je reçois un joli message qui me dit qu'un programme extérieur a tenté de lire ou d'écrire sur une zone mémoire protégée. blablabla.

Voilà la déclaration de ma fonction en C
__declspec(dllexport)void InitializeProLexisExtern(
short action,
long message,
HWND hWndAppl,
HWND hWndDesk)

Et la déclaration de la même fonction dans mon prog en c#
[DllImport("ProLexisDLL.dll")]
unsafe public extern static void InitializeProLexisExtern(short action,
long message,
IntPtr hWndAppl,
IntPtr hWndDesk);

Comment est-ce que je peux passer un pointeur sur lequel je peux lire ou écrire à ma fonction?

J'attends vos réponses avec impatience!

9 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
10 mars 2006 à 10:51
Salut,

Comment ça lire ou écrire sur la fenêtre ?

Sinon attention, le "long C++" est un entier 32bits signé, alors que le "long .Net" est un entier 64 bits signé.
long message => int message

/*
coq
MVP Visual C#
*/
0
jchoplin Messages postés 12 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 16 mars 2006
10 mars 2006 à 11:21
Je vais éclaircir mon projet.
J'ai une application de traitement de texte maison dans laquelle je souhaite intégrer un dictionnaire que nous utilisons. La société qui édite le dictionnaire m'a alors fourni une API à interfacer avec mon programme. C'est ce que je tente de faire. Normalement, on initialise le dictionnaire en lui passant un pointeur sur la fenêtre, et le dico installe gentiment son icône et son menu dans la barre de menu principale. Mais c'est là que ça semble coincer, c'est que le pointeur que je lui fournis est en mode lecture seule (d'après ce que je comprends).
Je ne sais pas si l'idée est plus claire maintenant.

Merci pour la correction du long, mais ça n'a pas suffi :(

Est-ce que les données que j'ai postée sont suffisantes pour pouvoir m'indiquer une voie à suivre?
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
10 mars 2006 à 11:38
Alors là ça risque d'être dur.
Je ne pense pas que le problème soit directement lié au handle de fenetre, il doit s'en servir pour récupérer les handle du menu et de la barre d'outils.

Il y a une doc lisible publiquement pour cette API ?

/*
coq
MVP Visual C#
*/
0
jchoplin Messages postés 12 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 16 mars 2006
10 mars 2006 à 14:23
Non il n'y a pas de doc publique pour cette API. C'est en vendant cette API qu'ils vivent aussi :) Par contre, dans la doc, à part l'explication des paramètres (qui n'indique pas grand chose) il n'y a rien qui permette de dire où se situe le problème. Selon eux, on fait appel à cette fonction, et hop ça marche. C'est super lourd.
Mais est-ce qu'il y a un moyen de donner à la zone mémoire de la fenêtre les droits en écriture? Est-ce moi qui comprend mal ou est-ce qu'un handle sur la fenêtre donne juste un accès en lecture seule?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
10 mars 2006 à 16:15
Oui je me doute bien que la lib n'est pas publique, je parlais juste de la doc lol

Sinon, tu as des exemples d'applications dans lesquels l'outil s'intègre ?

/*
coq
MVP Visual C#
*/
0
jchoplin Messages postés 12 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 16 mars 2006
13 mars 2006 à 10:54
Je viens de recevoir un mail de la part des développeurs de l'API. Il y avait un bug dans leur code, c'est pourquoi j'obtenais toujours une erreur d'écriture dans une zone mémoire protégée. Donc maintenant je récupère un pointeur HMENU de ma fonction Initialize, que je convertis en IntPtr en c# (je ne crois pas me tromper là), mais quand j'utilise la méthode IsMenu de user32.dll il me répond que ce n'en est pas un :( est-ce que je fais une erreur dans ma conversion? est-ce que c'est la valeur pointée par mon Intptr qui est l'adresse du menu?
En tout cas, merci beaucoup pour ton aide.
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
13 mars 2006 à 21:20
De quelle fonction Initialize ?
Celle citée au dessus est en void, et si il s'agit d'un des paramètres hwnd qui est en in/out ou out, il faudrait le passer respecxtivement par ref ou out.

/*
coq
MVP Visual C#
*/
0
jchoplin Messages postés 12 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 16 mars 2006
14 mars 2006 à 08:24
Effectivement je faisais une erreur de ce côté là.. Quel naze.. :(

Bon ok, me voilà avec un super menu que je récupère sous la forme d'un pointeur. Mais maintenant, comment je peux faire pour utiliser ce menu dans mon application? y-a-t il un convertisseur qui me permettrait de récupérer ce menu sous la forme d'un toolstripmenu?
0
jchoplin Messages postés 12 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 16 mars 2006
14 mars 2006 à 16:38
yes! J'ai encore avancé!
J'ai réussi à parcourir le menu récupéré item par item pour reprendre les chaînes de caractères de chaque item et créer un menu dans mon appli à l'aide des toolstripitem. Maintenant il faut que j'arrive à 1) soit récupérer les messages normalement envoyés par les différents item et les intégrer dans mon appli, ce qui va être très dur à mon avis. 2) Soit simplement renvoyer un ordre de "click" sur l'item du menu originel correspondant à celui qui vient d'être cliqué.
Je suis en train de me pencher sur la seconde solution mis je n'ai aucune idée de comment je peux faire cette simulation de clic. Il y a bien la fonction SendMessage, mais elle prend comme paramètre une fenêtre alors que moi je n'en ai pas. Comment est-ce que je peux intégrer un item dans le tag de mes toolstripmenuitem, puis simuler un clic dessus?

Merci d'avance!
0
Rejoignez-nous