2

私はこのように定義されたデルファイDLLを持っています

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;

私はこのようにC#に変換しました:

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

呼び出しは次のようになります。

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

チャネルを開くように求めており、それを conn に書き込みます。false を返します。だから通り抜けられない。conn オブジェクトは null を返します。サーバーが私の呼び出しを受信して​​いることはわかっています。

間違った型を持つ struct C# と関係があると思います。私は管理されていないものにはかなり慣れていないので、誰かが助けてくれるなら。

dllしかありません。ありがとう

4

3 に答える 3

2

char (NULL で終了する文字列) を使用してみて、関数にその char へのポインタを引数として与えます。

文字列で機能するはずです。

于 2009-09-21T16:56:18.667 に答える
0

これは役立つ場合とそうでない場合がありますが、C# コードでは tSSL_connect.sock (および SSLCLT_Connect プロトタイプ) に UInt32 (32 ビット符号なし整数) を使用しますが、Delphi ヘッダーはそれを Integer (32 ビット符号付き整数) として定義します。

これがうまくいかない場合は、C# からアクセスできるように tSSL_connect レコードとそのフィールドの間で変換を行うクイック ラッパーを Delphi で作成するという代替手段があります。

于 2009-07-06T12:26:14.820 に答える
0

これがあなたの問題かどうかはわかりませんが、dllimport で文字列を使用しているだけです。文字列のデフォルトのマーシャリング「スタイル」は、「接頭辞の長さとUnicode文字を持つCOMスタイルのBSTR」であるようです。null 終了文字列が必要です。それが問題である場合は、MarshalAs 属性を使用して、pIPAddr パラメータのマーシャリング タイプを設定します。

[MarshalAs(UnmanagedType.LPWStr)]

このような:

[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);
于 2009-07-08T14:31:27.207 に答える