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:

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;
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
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"');
Ç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
 
 Violation d’accès à l'adresse 77ED31CA dans le module 'MSVCR120D.dll'
Vous auriez s'il vous plait une solution pour contourner ce problème avec le type string?

Merci