Convertir un string en varchar* [Résolu]

Signaler
Messages postés
13
Date d'inscription
lundi 31 octobre 2005
Statut
Membre
Dernière intervention
1 février 2006
-
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
-
Bonjour,
je débute en C# et je dois créer une application CS utilisant une dll écrite en c.
J'arrive à appeler toutes les fonctions de la dll sauf celle prenant en argument un varchar* . Comment faire pour convertir les string en varchar* afin de pouvoir appeler la fonction?

15 réponses

Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
33
lol... j'ai trouvé...

donc :


unsafe {

fixed(
char* scChaineTraite = sChaineTraite) {
Wrap.ComTGCEcrire(sChaineTraite.Length, scChaineTraite);
}
}

ca devrait fonctionner.

Sébastien FERRAND
[MVP C#]
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
33
tu pourrais donner le prototype de ta fonction C ?
et aussi, le DllImport que tu utilises ?

Sébastien FERRAND
[MVP C#]
Messages postés
13
Date d'inscription
lundi 31 octobre 2005
Statut
Membre
Dernière intervention
1 février 2006

C'est une dll "technique" fournie par siemens. Voici le prototype de la fonction

[DllImport("C:\\siemens\\Srv_tgc\\inttgc_dll.dll", CharSet=CharSet.Ansi)]
public unsafe static extern int ComTGCEcrire(long taillemessage, char* message);
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
33
à la place de char* as-tu essayé "ref string" ?

Sébastien FERRAND
[MVP C#]
Messages postés
13
Date d'inscription
lundi 31 octobre 2005
Statut
Membre
Dernière intervention
1 février 2006

çà ne marche pas non plus avec "ref string"
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
33
essayons...

[DllImport("C:\\siemens\\Srv_tgc\\inttgc_dll.dll", CharSet=CharSet.Ansi)]
public unsafe static extern int ComTGCEcrire(long taillemessage, char* message);

private void blabla(string text) {

// on transforme le string en char[]
char[] bla = text.ToCharArray();
unsafe {
ComTGCEcrire( bla.Length, *bla );
}
}

ne pas oublier d'activer le code unsafe dans les options de compilation du projet.

Sébastien FERRAND
[MVP C#]
Messages postés
13
Date d'inscription
lundi 31 octobre 2005
Statut
Membre
Dernière intervention
1 février 2006

merci pour ton aide, malheureusement çà ne marche toujours pas :'-(
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
33
tu as une erreur d'exécution ? de compilation ?

Sébastien FERRAND
[MVP C#]
Messages postés
13
Date d'inscription
lundi 31 octobre 2005
Statut
Membre
Dernière intervention
1 février 2006

Erreur de compilation "L'opérateur * ou -> doit être appliqué à un pointeur"

Voici l'appel de la fonction:
int iRetour;
char[] scChaineTraite = sChaineTraite.ToCharArray();
unsafe
{
iRetour= Wrap.ComTGCEcrire(sChaineTraite.Length, *scChaineTraite);
}

et la déclaration de la fonction:
public unsafe static extern int ComTGCEcrire(long taillemessage, char* message);
[DllImport("C:\\siemens\\Srv_tgc\\inttgc_dll.dll", CharSet=CharSet.Ansi)]
Messages postés
13
Date d'inscription
lundi 31 octobre 2005
Statut
Membre
Dernière intervention
1 février 2006

le dllimport est situé avant la déclaration...
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
Pour un argument de type char* on peut utiliser le type string sauf que si la fonction modifie la chaine il faut passer un StringBuilder sinon la version de Seb avec le buffer fixé marche aussi.
Messages postés
13
Date d'inscription
lundi 31 octobre 2005
Statut
Membre
Dernière intervention
1 février 2006

CA MARCHE!!
Merci énormément, car j'ai vraiment eu du mal à trouver quelque chose qui marche sur internet pour convertir le string en varchar*. Mille fois merci !!
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
Fallait chercher LPSTR.
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
33
ouaip... LPSTR c'est le mieux... quand c'est toi qui développe la dll... dans son cas, il faut faire avec ce qu'on lui donne.

Sébastien FERRAND
[MVP C#]
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
Ce que je veux dire c'est que LPSTR c'est un char*, c'est pour ça que je lui propose le StringBuilder. Mais moi aussi je préfère ecrire mes prototypes avec des pointeurs.