Utilisation d'une Dll

Résolu
kyfranBibax Messages postés 26 Date d'inscription mercredi 11 mai 2005 Statut Membre Dernière intervention 6 janvier 2008 - 2 juin 2005 à 13:01
kyfranBibax Messages postés 26 Date d'inscription mercredi 11 mai 2005 Statut Membre Dernière intervention 6 janvier 2008 - 3 juin 2005 à 12:06
Coucou,



Je commence à bien m'amuser en c# mais il faut tout de même que j'utilise des dll écrites en c++.



Mon problème est que j'appelle une fonction de ma dll à partir de mon prog c# avec :

//déclaration de la fonction

[DllImport("CreatePal.dll")]

private static
extern int GenPal(string fileInput,string fileOutput, int colors);



et

int i = GenPal(@"C:\Documents and Settings\franck\Bureau\FR.bmp", @"C:\Documents and Settings\franck\Bureau\FR.pal",128)



Lors de la compilation, pas de problème...

Mais lors de l'execution, j'obtiens une exception de type : ReferenceNullException lors de l'appel de la fonction.



Je voudrai donc savoir si cette exception est dûe à mon appel (pb de type peut-être???) ou à une erreur dans ma Dll.

Pouvez vous me dire si le code de ma dll ne pose pas trop de problème
(je suis à peu près au niveau débutant alors vous comprenez...).

Voici le code :



.h

class CCreatePal {

public:

CCreatePal(CString strInput, CString strOutput, UINT nColors);

void GeneratePalette(CString strInput, CString strOutput, UINT nColors);

};



//exported function

CREATEPAL_API int (__stdcall GenPal)(CString strInput, CString strOutput, UINT nColors);




.cpp:



CCreatePal::CCreatePal(CString strInput, CString strOutput, UINT nColors)

{

return;

}



extern "C" CREATEPAL_API int (__stdcall GenPal)(CString strInput, CString strOutput, UINT nColors)

{

//create a CCreatePal Object

CCreatePal myCreatePal(strInput,strOutput,nColors);


myCreatePal.GeneratePalette(strInput,strOutput,nColors);


return 0;

}



Je pense que vous allez hurler avec mon constructeur mais au moins j'ai pas d'erreur et je pense pas que ça gêne...



Je vous remercie d'avance pour les commentaires me permettant de me tirer de ce mauvais pas.



Have a nice day



Bibax en fait un max

6 réponses

cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
2 juin 2005 à 17:00
salut,

dans ce que tu as dit, tu n'as pas donné le code de ta méthode GeneratePalette.

es tu egalement sur de pouvoir utiliser des CString depuis l'extérieur
?? (comment reussis tu a utiliser en c# une fonction c++ prenant des
CString alors que ce type est spécifique au c++ sauce microsoft) ?

tu
devrais mettre un type generique comme char* ... dans ton prog c#, la
conversion des strings en char* a plus de chances de se faire que celle
entre les string c# et les CString c++.



a+
3
tchoucky Messages postés 48 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 1 septembre 2006 2
2 juin 2005 à 14:32
"[DllImport("CreatePal.dll")]" signifie que ta dll doit se trouver soit
dans le repertoire de generation de ton appli c# soit dans un des
repertoire de reference de ton projet, est-ce le cas?
0
kyfranBibax Messages postés 26 Date d'inscription mercredi 11 mai 2005 Statut Membre Dernière intervention 6 janvier 2008
2 juin 2005 à 14:48
Coucou,



Tout est ok de ce côté là.

J'utilise une autre dll (en c) et elle tourne bien.

Les 2 se trouvent dans le même rép et est détectée (sinon j'aurais l'exception "dll not found").



A ton avis, le code de ma fonction exportée en cpp est bon?

Et les types corespondent bien?

Have a nice day



Bibax en fait un max
0
tchoucky Messages postés 48 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 1 septembre 2006 2
2 juin 2005 à 15:10
Je suis desolé mais les dll que je crée en c sont bcp plus simple.

Avec visual studio 6, je crée un nouveau projet "library" et il me
génère un .def ou j'ajoute juste les noms des fonctions que je veux
exporter mais sans signature. Je ne peux faire de surcharge mais bon c
pas bien grave...
0

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

Posez votre question
tchoucky Messages postés 48 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 1 septembre 2006 2
2 juin 2005 à 17:08
Moi pour passer des string je les convertis en byte[] et je les récupère en char *



public static byte[] StringToByte(string chaine)

{

if(chaine == null)

return null;



Encoding ansi = Encoding.Default;

Encoding unicode = Encoding.Unicode;



byte[] unicodeBytes = unicode.GetBytes(chaine);



byte[] ansiBytes = Encoding.Convert(unicode, ansi, unicodeBytes);

return ansiBytes;

}



bien sûr ça dépend de ton codage...
0
kyfranBibax Messages postés 26 Date d'inscription mercredi 11 mai 2005 Statut Membre Dernière intervention 6 janvier 2008
3 juin 2005 à 12:06
Coucou,



Merci bien pour cette solution.



Voici comment déclarer la dll et s'en servir :



En fait dans mon prog c#, je passe en paramètre des string :

déclaration :

[DllImport("CreatePal.dll", EntryPoint="GenPal", CallingConvention=CallingConvention.StdCall)]

public static extern int GenPal(string fileInput,string fileOutput, int colors);

Appel de la fonction:

GenPal(@"...\Nénuphars.bmp", @"...\nenu.pal",128);



Dans ma Dll, je les récupère en tant que char* mais je devais
obligatoirement me servir de CString donc une petit conversion s'est
imposée :


extern "C" CREATEPAL_API int (__stdcall GenPal)(char* strInput, char* strOutput, UINT nColors)

{

//create a CCreatePal Object

CCreatePal myCreatePal(strInput,strOutput,nColors);

//Generate my palette

myCreatePal.GeneratePalette(strInput,strOutput,nColors);

return 0;

}



void CCreatePal::GeneratePalette(char* input, char* output, UINT nColors)

{

//convert input parameter into CString

CString strInput(input);

strInput = input;

CString strOutput(output);

strOutput = output;



strInput.TrimLeft ();

strInput.TrimRight ();

strOutput.TrimLeft ();

strOutput.TrimRight ();

}



Je dois avouer que ce n'était pas le seul bug mais trouver celui-ci m'a permis de trouver les autres par la suite.

Mon NullReferenceException n'était pas dûe à cela mais à une
initialisation de variable. Je l'initai à NULL et je ne sais pourquoi,
j'ai dû supprimer sa mise en valeur.

En tout



Have a nice day



Bibax en fait un max
0
Rejoignez-nous