помогите перевести сигнатуру из dll на C#
От: Аноним  
Дата: 30.08.07 09:53
Оценка:
Привет всем

Есть сигнатура Delphi, описывающая функцию в dll

function _ExportKeys(hProv: HCRYPTPROV; PinCode: PChar; var PrivateKey, PublicKey: PByte;
var PrivateKeyLen, PublicKeyLen: DWORD; IsSignKey: Boolean): Boolean;
stdcall; external EXPORT_CRYPTO_NAME name '_ExportKeys';


пытаюсь её описать на c# и ничего не выходит
В чем проблема?

Если прогнать метод трассировкой, то в delphi получаются правильные значения (с ними прога дальше нормально работает)-
privateKey : $950bb0
publicKey: $950ce8
privateKeyLen: 308
publicKeyLen: 84

Одна из попыток описать была такой:

        [DllImport("sspCrypto.dll", EntryPoint = "_ExportKeys")]
        public static extern bool ExportKeys(HCRYPTPROV provider,
                                             [MarshalAs(UnmanagedType.LPStr)] string pinCode,
                                             out IntPtr privateKey,
                                             out IntPtr publicKey,
                                             out int privateKeyLength,
                                             out int publicKeyLength,
                                             bool isSignKey
            );


но вот результаты черте-какие
privateKey : 67964120
publicKey: 308
privateKeyLen: 84
publicKeyLen: 0

Как написать, чтобы нормально заработало?
Re: помогите перевести сигнатуру из dll на C#
От: _FRED_ Черногория
Дата: 30.08.07 10:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть сигнатура Delphi, описывающая функцию в dll

А> function _ExportKeys(hProv: HCRYPTPROV; PinCode: PChar; var PrivateKey, PublicKey: PByte;
А> var PrivateKeyLen, PublicKeyLen: DWORD; IsSignKey: Boolean): Boolean;
А> stdcall; external EXPORT_CRYPTO_NAME name '_ExportKeys';

А>пытаюсь её описать на c# и ничего не выходит
А>В чем проблема?
А>Одна из попыток описать была такой:
А>        [DllImport("sspCrypto.dll", EntryPoint = "_ExportKeys")]
А>        public static extern bool ExportKeys(HCRYPTPROV provider,
А>                                             [MarshalAs(UnmanagedType.LPStr)] string pinCode,
А>                                             out byte privateKey,
А>                                             out byte publicKey,
А>                                             out uint privateKeyLength,
А>                                             out uint publicKeyLength,
А>                                             bool isSignKey
А>            );
Help will always be given at Hogwarts to those who ask for it.
Re[2]: помогите перевести сигнатуру из dll на C#
От: Аноним  
Дата: 30.08.07 11:07
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, Аноним, Вы писали:


А>>Есть сигнатура Delphi, описывающая функцию в dll

_FR>

А>> function _ExportKeys(hProv: HCRYPTPROV; PinCode: PChar; var PrivateKey, PublicKey: PByte;
А>> var PrivateKeyLen, PublicKeyLen: DWORD; IsSignKey: Boolean): Boolean;
А>> stdcall; external EXPORT_CRYPTO_NAME name '_ExportKeys';

А>>пытаюсь её описать на c# и ничего не выходит
А>>В чем проблема?
А>>Одна из попыток описать была такой:
_FR>
А>>        [DllImport("sspCrypto.dll", EntryPoint = "_ExportKeys")]
А>>        public static extern bool ExportKeys(HCRYPTPROV provider,
А>>                                             [MarshalAs(UnmanagedType.LPStr)] string pinCode,
А>>                                             out byte privateKey,
А>>                                             out byte publicKey,
А>>                                             out uint privateKeyLength,
А>>                                             out uint publicKeyLength,
А>>                                             bool isSignKey
А>>            );
_FR>


Та же фигня.

Тем более непонятно, что с теми byte'ами дальше делать.
Как видно в значениях переменных из первого сообщения, дельфи как-то разбирается с тем, что в PByte лежит что-то большее, чем один байт.

А так — такие цифири вытаскиваются, что ничего полезного не дает

privateKey 216 byte
publicKey 52 byte
privateKeyLength 84 uint
publicKeyLength 0 uint
Re[2]: помогите перевести сигнатуру из dll на C#
От: Аноним  
Дата: 30.08.07 14:11
Оценка:
Вот работающий результат

[DllImport(ExportCryptoName, EntryPoint = "_ExportKeys",CallingConvention = CallingConvention.StdCall)]
public static extern bool ExportKeys(HCRYPTPROV provider,
[MarshalAs(UnmanagedType.LPStr)] string pinCode,
[Out]out IntPtr privateKey,
[Out]out IntPtr publicKey,
[Out]out int privateKeyLength,
[Out]out int publicKeyLength,
bool isSignKey
);

После чего массивы байтов через Marshal

byte[] privateKey = new byte[privateKeyLength];
Marshal.Copy(privateKeyPtr, privateKey, 0, privateKeyLength);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.