Bonjour,
Je programme sous Delphi 2005. J'utilise une DLL développé en C++ sous Visual Studio 2013 contenant des fonctions avec des arguments de Type String. J'essaye de les appeler dans mon programme delphi mais j'ai une exception qui est levé
J'ai essayé avec une DLL test (simplifier) dont le code est :
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #ifdef STRDLL_EXPORTS #define STRDLL_API __declspec(dllexport) #else #define STRDLL_API __declspec(dllimport) #endif #include <string> namespace NSTRDLL { // This class is exported from the MathFuncsDll.dll class MySTRDLL { public: // Returns a + b static STRDLL_API std::string concatener(std::string str1, std::string str2); static STRDLL_API char* associer(char* str1, int str2); }; }
je fais mon appel dans le programme delphi à l'aide de c'est deux fonction:
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 function TForm1.LierFonction(DLL: String; var HandleDLL: THandle; NomFct: String; IndexFct: Integer = -1): Pointer; begin //Valeurs de retour par défaut Result := nil; HandleDLL := 0; //Chargement de la DLL. On récupère son handle HandleDLL := LoadLibrary(pAnsiChar(DLL)); //Si le chargement a échoué, on sort If HandleDLL = 0 then Exit; //On récupère l'adresse de la fonction voulue, que l'on renvoie If IndexFct < 0 then //Si l'index est négatif on utilise le nom sous forme de chaîne Result := GetProcAddress(HandleDLL, pAnsiChar(NomFct)) else //Sinon, on utilise l'index comme identifiant Result := GetProcAddress(HandleDLL, pAnsiChar(IndexFct)); end;
Ça marche très bien avec des arguments de type C++ int, double ou char * mais pas avec des string ou j'ai le message:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 procedure TForm1.Button1Click(Sender: TObject); var temp : integer; HandleDLL: THandle; //Pour stocker le handle de la DLL chargée concatener : function(A, B: string): string; stdcall; //Notre fonction, sous forme de variable begin concatener := LierFonction('STRDLL.dll', HandleDLL , '?concatener@MySTRDLL@NSTRDLL@@SA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V34@0@Z'); //Si Somme a bien reçu un pointeur valide sur une fonction If assigned(concatener ) then try ShowMessage('A + B = '+ concatener('premireChaine',' deuxiemeChaine')); finally //Ne pas oublier de libérer la DLL lorsqu'elle n'est plus nécessaire FreeLibrary(HandleDLL); end else //Sinon, on affiche un message d'erreur : appeler Somme provoquerait une violation d'accès ShowMessage('Erreur de chargement de la fonction "concatener"');
Vous auriez s'il vous plait une solution pour contourner ce problème avec le type string?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Violation daccès à l'adresse 77ED31CA dans le module 'MSVCR120D.dll'
Merci
Partager