DllImport

Résolu
Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Statut
Membre
Dernière intervention
2 août 2010
-
Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Statut
Membre
Dernière intervention
2 août 2010
-
Bonjour,

Je dois dois faire le lien entre une dll C++ et C#

La fonction
    [DllImport(DLL_NAME, CharSet = CharSet.Ansi, EntryPoint = "MvaSensorNew")]
    private static extern IntPtr MvaSensorNew();
retourne un pointeur sur l'objet

La fonction
  [DllImport(DLL_NAME, EntryPoint = "?isButtonPushed@MvaSensor@@QAE_NH@Z",    CharSet CharSet.Ansi, CallingConvention CallingConvention.ThisCall)]
    private static extern bool isButtonPushed(IntPtr _iPtr, int _iNumCapteur);

doit me retourner l'état d'enfoncement d'un bouton d'un matériel.
Or le retour de la fonction est toujours true
- bien que cette dll fonctionne correctement avec un programme C++ classique
- bien que le pointeur soit correct (d'autre procédure de cette dll fonctionne)

Voilà le nom non décoré de la fonction bool MvaSensor::isButtonPushed(int)
Voilà le nom décoré ?isButtonPushed@MvaSensor@@QAE_NH@Z

Il y a t il une erreur de ma part lors de l'appel à cette fonction (exp : bool b=isButtonPushed(iptrHandle,10]) ou lors de sa création pour C#

Merci de vos réponses.
RMI

11 réponses

Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Statut
Membre
Dernière intervention
2 août 2010
2
Bonjour et bonne année à tous,

J'ai enfin trouvé

[return: MarshalAs(UnmanagedType.I1)] et ça marche !!!!!

Merci pour vos interventions.

RMI
Messages postés
31
Date d'inscription
mercredi 14 juin 2006
Statut
Membre
Dernière intervention
11 janvier 2008

non à priori, je ne vois pas d'erreur grossière à premiere vue

Maintenant, peut-etre que l'info en argument fait que ta fonction te retourne
toujours true..

Au pire, tu mets un return false des le debut de ta fonction C++ et tu vois bien
ce que tu recuperes.. si tu recuperes False c'est que c'est le code C++ qui est
à incriminer.. sinon, no idea :)

The Monz, Toulouse
Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Statut
Membre
Dernière intervention
2 août 2010
2
Salut,

J'ai fait des tests avec une fonction de la dll qui retourne toujours true (AlwaysTrue) et une qui retourne toujours false (AlwaysFalse)

Résultats :
AlwaysTrue =>true;
AlwaysFalse=>true;

Par contre si on force ces fonction en int
AlwaysTrue =>257;

AlwaysFalse=>256;

Quand penses tu?

RMI
Messages postés
31
Date d'inscription
mercredi 14 juin 2006
Statut
Membre
Dernière intervention
11 janvier 2008

j'en pense qu'il doit y avoir un soucis entre le bool C# et le bool C++ retourne

Cela dit, c'est quand meme etrange car j'ai déja fait ce genre de fonction et
cela fonctionnait sans avoir à faire de "bidouille"

Peut-etre dans les options de compilation de ton projet C++ (genre unicode ou
autre)

The Monz, Toulouse
Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Statut
Membre
Dernière intervention
2 août 2010
2
Ok, je vais voir avec le programmeur de la dll

RMI
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Membre
Dernière intervention
27 octobre 2012
42
Salut, esaye ça..

[ DllImport( "..." ) ]
[ return: MarshalAs( UnmanagedType.Bool ) ] // Valeur de retour sur 1 octet.
public static extern bool DoSomething( .. )
Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Statut
Membre
Dernière intervention
2 août 2010
2
Merci de ton intervention Lutinore, mais ta solution ne fonctionne pas, j'ai un retour toujours à true.

RMI
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
25
salut,

si tu mets un retour en byte ca te renvoie quoi ?

sinon tu es sûr du ThisCall, on ne sait jamais si ca passait en Cdecl ou en FastCall ?

ShareVB
Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Statut
Membre
Dernière intervention
2 août 2010
2
Salut,

Je suis sur du ThisCall car j'utilise un objet de la dll et le retour en byte me renvoie une valeur et non un booléen.
Merci de ton intervention

RMI
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
25
salut,

de souvenir en C/C++, le BOOL est un int pas un char après effectivement le type "natif" bool est peut être d'un octet...dans tous les cas, tu dit :
    Par contre si on force ces fonction en int
    AlwaysTrue =>257;
    AlwaysFalse=>256;
> donc true 1 sur un octet, false = 0 sur un octet, le bit 1 qui se trouve dans le premier bit de deuxième octet doit être résiduel car je ne pense pas qu'un compilateur soit obligé de faire un "xor eax,eax" pour renvoyer un octet dans "al"...

donc normalement si tu fais un retour en "byte", tu dois récupérer 0 et 1 donc tu as ton booléen...

ShareVB
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Membre
Dernière intervention
27 octobre 2012
42
BOOL = 32 bits.
bool du C++ = 8 bits.

Je ne pense pas à un bit résiduel mais plutôt à un dépassement de capacité :
int b1 unchecked( ( byte )256 ); // 0int b2 unchecked( ( byte )257 ); // 1