Utilisation d'une DLL delphi dans du code managé C#

Signaler
Messages postés
32
Date d'inscription
mardi 15 juin 2004
Statut
Membre
Dernière intervention
8 juillet 2009
-
Messages postés
1
Date d'inscription
mercredi 20 août 2008
Statut
Membre
Dernière intervention
20 novembre 2009
-
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

Coté C#
[DllImport(@"xxx.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
publicstaticexternBoolean LicLoad(string aNumLicence, string aCertifs, string aCleMaj);

Ou autre exemple fonctionnel, cette fois ci qui renvoie quelque chose:

Coté Delphi:
function AW2TVersion: pchar

Coté C#
[DllImport(@"xxx.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
publicstaticexternstring AW2TVersion();

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" /??>[

DllImport(
@"xxx.dll", CallingConvention =
CallingConvention.StdCall)]
[
return:
MarshalAs(
UnmanagedType.SysUInt)]

private
static
extern
IntPtr LicGetRaisonSocial();

public
static
string LicGetRaisonSocialCsharp()
{

IntPtr p = LicGetRaisonSocial();

return
Marshal.PtrToStringAnsi(p);
}

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.

1 réponse

Messages postés
1
Date d'inscription
mercredi 20 août 2008
Statut
Membre
Dernière intervention
20 novembre 2009

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();
}