Utilisation d'une DLL delphi dans du code managé C#
Prince Dark
Messages postés32Date d'inscriptionmardi 15 juin 2004StatutMembreDernière intervention 8 juillet 2009
-
8 juil. 2009 à 16:35
brunetlyon
Messages postés1Date d'inscriptionmercredi 20 août 2008StatutMembreDernière intervention20 novembre 2009
-
20 nov. 2009 à 11:59
Bonjour,
Je suis actuellement dans le but d'utiliser des fonctions non managées contenues dans une DLL ecrite en delphi dans mon code C#.
La DLL est fixe et je ne peux la changer, j'ai simplement son prototypage. Je precise car certaines modif de cette DLL m'aurai bien aidé.
J'ai pour l'instant non sans mal réussi à utiliser un certain nombre de fonction.
Par exemple:
Coté delphi:
function LicLoad(aNumLicence,aCertifs,aCleMaj:pchar):Boolean
Donc pour l'instant tout va bien. La ou cela ce complique est pour le retour d'un string delphi. Comme tout le monde le sais, un string delphi contient sa longueur, puis le tableau de caractere sans zero final. J'ai pour l'instant simplifié à cela, mais sans grand espoir.
Coté delphi:
function LicGetRaisonSocial: shortstring
Coté C#<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>[
Quelques soit mes essais, en recuperant une chaine de caractere sous differents formats, un pointeur ou n'importe quoi d'autre j'ai ce message d'erreur:
Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.
sur la ligne: IntPtr p = LicGetRaisonSocial();
Je pense donc qu'il y a un manque d'homogénéité dans mon rapatriment, mais j'avou etre un peu à bout, merci d'avance pour votre aide.
brunetlyon
Messages postés1Date d'inscriptionmercredi 20 août 2008StatutMembreDernière intervention20 novembre 2009 20 nov. 2009 à 11:59
Quel version de Delphi as-tu ?
Coté C# : tu utilises VisualStudio ou Delphi ?
Avec Delphi 9, tu peux créer un projet de type Library
celà génère bien une .dll
Après, j'utilise Visual Studio pour ajouter une référence sur cette .dll (en cliquant avec le bouton droit sur "References" dans l'explorateur de solutions)
En ajoutant using Class1; je retrouver bien l'unité Class1 de ma class TClass1 avec la fonction :
Function TClass1.test:String;
begin
Result:='OK';
end;
Dans une fonction C#, tout fonctionne bien :
protected void CmdLogin_Click(object sender, EventArgs e)
{
TClass1 pascal_obj = new TClass1();
string s = pascal_obj.test();
}