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

fkerbourch 7 Messages postés jeudi 26 mai 2005Date d'inscription 14 novembre 2008 Dernière intervention - 8 mars 2006 à 17:23 - Dernière réponse : fkerbourch 7 Messages postés jeudi 26 mai 2005Date d'inscription 14 novembre 2008 Dernière intervention
- 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
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 9 mars 2006 à 14:35
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

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

Commenter la réponse de Lutinore
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 8 mars 2006 à 18:02
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
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 8 mars 2006 à 18:19
0
Merci
Et CharSet = CharSet.Unicode si tu veux marshaller les chaines en unicode.
Commenter la réponse de Lutinore
fkerbourch 7 Messages postés jeudi 26 mai 2005Date d'inscription 14 novembre 2008 Dernière intervention - 9 mars 2006 à 11:03
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
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 9 mars 2006 à 12:00
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
fkerbourch 7 Messages postés jeudi 26 mai 2005Date d'inscription 14 novembre 2008 Dernière intervention - 9 mars 2006 à 12:27
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
fkerbourch 7 Messages postés jeudi 26 mai 2005Date d'inscription 14 novembre 2008 Dernière intervention - 9 mars 2006 à 17:11
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.