Ringe en Delphi DLL fra C # inneholder Pointer i struct ikke fungerer

stemmer
2

Jeg har en delphi dll som er definert som dette

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;

Jeg konvertert til C # som dette:

[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);

Samtalen er som dette:

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

Det er å be om å åpne en kanal og skriver det i tilk. Den returnerer false. Så jeg kan ikke komme gjennom. De Oppkobling gjenstander returnerer null. Jeg vet at serveren mottar mitt kall.

Jeg tror at det har noe å gjøre med struct C # som har en feil type. Jeg er ganske ny på uovervåkede ting så hvis noen kan hjelpe å få gjennom.

Jeg har bare dll. Takk

Publisert på 03/07/2009 klokken 20:34
kilden bruker
På andre språk...                            


3 svar

stemmer
2

Prøv å bruke en char (NULL avsluttet streng) og gi den funksjon en pointere til at char som et argument.

Bør arbeide for strenger.

Svarte 21/09/2009 kl. 16:56
kilden bruker

stemmer
0

Jeg er ikke sikker på om dette er ditt problem, men jeg merker at du bare bruker streng i DllImport. Det ser ut til at standard marshalling 'stil' for strykere er "A COM-stil Bstr med et prefiks lengde og Unicode-tegn". Du trenger en null avslutnings streng. Dersom det er problemet deretter bruke MarshalAs attributt for å angi oppstillingstype for pIPAddr parameter:

[MarshalAs(UnmanagedType.LPWStr)]

Som dette:

[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);
Svarte 08/07/2009 kl. 14:31
kilden bruker

stemmer
0

Dette kan eller kan ikke hjelpe deg, men i C # koden du bruker uint32 (32-bit usignert heltall) for tSSL_connect.sock (og i SSLCLT_Connect prototype), mens Delphi header definerer det som Integer (32-bit signert heltall).

Hvis dette ikke fungerer så alternativet er å skrive en rask wrapper i Delphi som konverterer mellom tSSL_connect posten og feltene slik at den kan nås av C #.

Svarte 06/07/2009 kl. 12:26
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more