C# : appel d'une fonction C++ d'une dll (type TCHAR*)

Résolu
fkerbourch Messages postés 7 Date d'inscription jeudi 26 mai 2005 Statut Membre Dernière intervention 14 novembre 2008 - 8 mars 2006 à 17:23
fkerbourch Messages postés 7 Date d'inscription jeudi 26 mai 2005 Statut Membre 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));

7 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
9 mars 2006 à 14:35
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( ) );
}
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
8 mars 2006 à 18:02
Salut,

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

[DllImport("DMIPrintMonitor.dll")]
static extern int PrinterSendFileTo(string printerName, string filePath);
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
8 mars 2006 à 18:19
Et CharSet = CharSet.Unicode si tu veux marshaller les chaines en unicode.
0
fkerbourch Messages postés 7 Date d'inscription jeudi 26 mai 2005 Statut Membre Dernière intervention 14 novembre 2008
9 mars 2006 à 11:03
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 ?
0

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

Posez votre question
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
9 mars 2006 à 12:00
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.
0
fkerbourch Messages postés 7 Date d'inscription jeudi 26 mai 2005 Statut Membre Dernière intervention 14 novembre 2008
9 mars 2006 à 12:27
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é)
0
fkerbourch Messages postés 7 Date d'inscription jeudi 26 mai 2005 Statut Membre Dernière intervention 14 novembre 2008
9 mars 2006 à 17:11
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.
0
Rejoignez-nous