Convertir un string en varchar* [Résolu]

Messages postés
13
Date d'inscription
lundi 31 octobre 2005
Statut
Membre
Dernière intervention
1 février 2006
- - Dernière réponse : Lutinore
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
- 14 nov. 2005 à 14:03
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?
Afficher la suite 

Votre réponse

15 réponses

Meilleure réponse
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
29
3
Merci
lol... j'ai trouvé...

donc :


unsafe {

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

ca devrait fonctionner.

Sébastien FERRAND
[MVP C#]

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 154 internautes nous ont dit merci ce mois-ci

Commenter la réponse de sebmafate
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
29
0
Merci
tu pourrais donner le prototype de ta fonction C ?
et aussi, le DllImport que tu utilises ?

Sébastien FERRAND
[MVP C#]
Commenter la réponse de sebmafate
Messages postés
13
Date d'inscription
lundi 31 octobre 2005
Statut
Membre
Dernière intervention
1 février 2006
0
Merci
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);
Commenter la réponse de ybuchheit
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
29
0
Merci
à la place de char* as-tu essayé "ref string" ?

Sébastien FERRAND
[MVP C#]
Commenter la réponse de sebmafate
Messages postés
13
Date d'inscription
lundi 31 octobre 2005
Statut
Membre
Dernière intervention
1 février 2006
0
Merci
çà ne marche pas non plus avec "ref string"
Commenter la réponse de ybuchheit
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
29
0
Merci
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#]
Commenter la réponse de sebmafate
Messages postés
13
Date d'inscription
lundi 31 octobre 2005
Statut
Membre
Dernière intervention
1 février 2006
0
Merci
merci pour ton aide, malheureusement çà ne marche toujours pas :'-(
Commenter la réponse de ybuchheit
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
29
0
Merci
tu as une erreur d'exécution ? de compilation ?

Sébastien FERRAND
[MVP C#]
Commenter la réponse de sebmafate
Messages postés
13
Date d'inscription
lundi 31 octobre 2005
Statut
Membre
Dernière intervention
1 février 2006
0
Merci
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)]
Commenter la réponse de ybuchheit
Messages postés
13
Date d'inscription
lundi 31 octobre 2005
Statut
Membre
Dernière intervention
1 février 2006
0
Merci
le dllimport est situé avant la déclaration...
Commenter la réponse de ybuchheit
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
27
0
Merci
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.
Commenter la réponse de Lutinore
Messages postés
13
Date d'inscription
lundi 31 octobre 2005
Statut
Membre
Dernière intervention
1 février 2006
0
Merci
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 !!
Commenter la réponse de ybuchheit
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
27
0
Merci
Fallait chercher LPSTR.
Commenter la réponse de Lutinore
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
29
0
Merci
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#]
Commenter la réponse de sebmafate
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
27
0
Merci
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.
Commenter la réponse de Lutinore