2009-07-03 9 views
2

J'ai une dll delphi qui est défini comme celui-ciL'appel d'une DLL Delphi de C# contenant Pointer à struct ne fonctionne pas

type 
tSSL_connect   = packed record 
     pssl   : Pointer; 
     pctx   : Pointer; 
     sock   : Integer; 
end; 

function SSLCLT_Connect(pIPAddr: PChar; 
    iPort: Integer; 
    var pConn: tSSL_connect; 
    iTimeout: Integer; 
    bEnableNonBlockingMode: BOOL = TRUE): BOOL; 
    stdcall; external cltdll; 

Je me suis converti en C# comme ceci:

[StructLayout(LayoutKind.Sequential,CharSet = CharSet.Ansi, Pack=1)] 
     public unsafe struct tSSL_connect 
     { 
      public IntPtr pssl; 
      public IntPtr pctx; 
      public UInt32 sock; 
     }; 

[DllImport("cltdll.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] 
     public static extern bool SSLCLT_Connect(string pIPAddr, UInt32 iPort, ref tSSL_connect pConn, UInt32 iTimeout, bool bEnableNonBlockingMode); 

L'appel est comme ceci:

tSSL_connect conn = new tSSL_connect(); 
btest = SSLCLT_Connect("127.0.0.1", 3858, ref conn, 1500, false); 

Il demande d'ouvrir un canal et l'écrit dans conn. Renvoie false. Donc je ne peux pas passer à travers. Les objets conn renvoient null. Je sais que le serveur reçoit mon appel.

Je pense que cela a quelque chose à voir avec la structure C# qui a un mauvais type. Je suis assez nouveau pour les choses non gérées, donc si quelqu'un peut aider à passer à travers.

Je n'ai que la DLL. Merci

Répondre

0

Cela peut ou ne peut pas vous aider mais, dans votre code C# vous utilisez UInt32 (entier non signé 32 bits) pour tSSL_connect.sock (et dans le prototype SSLCLT_Connect) alors que l'en-tête Delphi le définit comme Integer (32- bit entier signé). Si cela ne fonctionne pas, l'alternative est d'écrire un wrapper rapide dans delphi qui convertit entre l'enregistrement tSSL_connect et ses champs de sorte qu'il puisse être accédé par C#.

0

Je ne sais pas si c'est votre problème mais je remarque que vous n'utilisez que des chaînes dans votre fichier dllimport. Il semble que le "style" par défaut pour les chaînes de caractères est "Un BSTR de style COM avec une longueur préfixée et des caractères Unicode". Vous avez besoin d'une chaîne de terminaison nulle. Si tel est le problème puis utilisez l'attribut MarshalAs pour définir le type de rassemblement pour le paramètre pIPAddr:

[MarshalAs(UnmanagedType.LPWStr)] 

Comme ceci:

[DllImport("cltdll.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] 
     public static extern bool SSLCLT_Connect([MarshalAs(UnmanagedType.LPWStr)]string pIPAddr, UInt32 iPort, ref tSSL_connect pConn, UInt32 iTimeout, bool bEnableNonBlockingMode); 
2

Essayez d'utiliser un char (chaîne terminée par NULL) et donner la fonction un pointeur vers ce char comme argument.

Devrait fonctionner pour les chaînes.

Questions connexes