C# : appel d'une fonction C++ d'une dll (type TCHAR*) [Résolu]

Messages postés
7
Date d'inscription
jeudi 26 mai 2005
Dernière intervention
14 novembre 2008
- - Dernière réponse : fkerbourch
Messages postés
7
Date d'inscription
jeudi 26 mai 2005
Dernière intervention
14 novembre 2008
- 9 mars 2006 à 17:11
Je veux appeler une fonction d'une dll écrite en C++ (compilé avec VS .
net). Mais ca ne fonctionne pas ?
Je suis débutant en C# et je pense qu'il y a un pb de type entre "TCHAR*" et "string"

//déclaration C++ :
int PrinterSendFileTo(TCHAR* printerName, TCHAR* filePath)

//déclaration C# :
[DllImport("DMIPrintMonitor")]
static extern int PrinterSendFileTo(string printerName, string filePath);

//appel C#
PrinterSendFileTo("EPSONC82",openFileDialog1.FileName);



Je fais la même chose en delphi, et ca fonctionne :

//déclaration delphi :
function PrinterSendFileTo(printerName: pWideChar;filePath:pWideChar):integer; cdecl; external 'DMIPrintMonitor.dll' name 'PrinterSendFileTo';

//appel delphi
PrinterSendFileTo(pWideChar(fPrinterName),pWideChar(FFileName));
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
3
Merci
StringBuilder c'est uniquement pour les paramètres qui sont en entrée et sortie, donc là à mon avis c'est pas utile.

Essayes ça on devrait mieux comprendre :

[ DllImport( "DMIPrintMonitor.dll" ) ]
static extern int PrinterSendFileTo( string name, string path );


// ..

try
{
PrinterSendFileTo( "EPSONC82", filename );
}
catch ( Exception ex )
{
MessageBox.Show( ex.ToString( ) );
}

Merci Lutinore 3

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

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de Lutinore
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
0
Merci
Salut,

StringBuilder si tes chaines doivent être modifiées par la fonction.

[DllImport("DMIPrintMonitor.dll")]
static extern int PrinterSendFileTo(string printerName, string filePath);
Commenter la réponse de Lutinore
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
0
Merci
Et CharSet = CharSet.Unicode si tu veux marshaller les chaines en unicode.
Commenter la réponse de Lutinore
Messages postés
7
Date d'inscription
jeudi 26 mai 2005
Dernière intervention
14 novembre 2008
0
Merci
Je fais donc cette déclaration :
[DllImport("DMIPrintMonitor.dll",CharSet=CharSet.Unicode)]
static extern int PrinterSendFileTo(StringBuilder printerName, StringBuilder filePath);

et l'appel :

int rep=PrinterSendFileTo(new StringBuilder("EPSONC82"),new StringBuilder(openFileDialog1.FileName));


Ca ne fonctionne pas ?
Commenter la réponse de fkerbourch
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
0
Merci
Tu nous aide pas beaucoup : "Ca ne fonctionne pas" c'est quand même très vague, utilise un try/catch. As tu une exception ? Quel est le message de l'exception ? Le programme trouve t'il la dll ? T'es sûr que c'est le marshalling qui ne marche pas ou c'est ta fonction PrinterSendFileTo ?

StringBuilder c'est utile si tu dois récupérer la chaine modifiée mais la tu peux pas la récupérer tu as pas maintenue de référence.
Commenter la réponse de Lutinore
Messages postés
7
Date d'inscription
jeudi 26 mai 2005
Dernière intervention
14 novembre 2008
0
Merci
La fonction "PrinterSendFileTo" de la dll fonctionne puisque je fait la même chose avec un prog DELPHI.
Les valeurs des chaines sont des constantes non modifiées, donc StringBuilder ne sert à rien ?
Je vais modif programme pour récupérer l'exception si il en a une.
(désolé je débute et ma capacité à écrire rapidemment en C# est limité)
Commenter la réponse de fkerbourch
Messages postés
7
Date d'inscription
jeudi 26 mai 2005
Dernière intervention
14 novembre 2008
0
Merci
En fait ca fonctionne avec
[DllImport("DMIPrintMonitor.dll",CharSet=CharSet.Unicode)]
static extern int PrinterSendFileTo(String printerName, String filePath);

et

PrinterSendFileTo( "EPSONC82", filename );

J'avais fait une connerie, sorry et merci pour ton aide.
Commenter la réponse de fkerbourch

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.