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

Signaler
Messages postés
7
Date d'inscription
jeudi 26 mai 2005
Statut
Membre
Dernière intervention
14 novembre 2008
-
Messages postés
7
Date d'inscription
jeudi 26 mai 2005
Statut
Membre
Dernière intervention
14 novembre 2008
-
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));
A voir également:

7 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
36
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( ) );
}
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
36
Salut,

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

[DllImport("DMIPrintMonitor.dll")]
static extern int PrinterSendFileTo(string printerName, string filePath);
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
36
Et CharSet = CharSet.Unicode si tu veux marshaller les chaines en unicode.
Messages postés
7
Date d'inscription
jeudi 26 mai 2005
Statut
Membre
Dernière intervention
14 novembre 2008

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 ?
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
36
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.
Messages postés
7
Date d'inscription
jeudi 26 mai 2005
Statut
Membre
Dernière intervention
14 novembre 2008

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é)
Messages postés
7
Date d'inscription
jeudi 26 mai 2005
Statut
Membre
Dernière intervention
14 novembre 2008

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.