Utilisation d'une variable de type string d'une DLL en C++ dans un programme Delphi
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:
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:
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:
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:
1 2
|
Violation daccè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