Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите с C++ dll

33K
14 мая 2008 года
Padavan1
15 / / 07.05.2008
Доброго времени суток!
помогите с траблой!

Есть такое описание функции в библиотеке

BOOL DoSign(DWORD dSI,DWORD dPI,BYTE* message,DWORD dMesSize,BYTE** chSignedMes,DWORD* dSignedSize);

подпись сообщения.
message - исходное сообщение для отсылки
dMesSize - размер исходного сообщения без завершающего нулевого байта
chSignedMes - указатель на буфер в который будет записано готовое, подписанное сообщение. Если NULL, то в dSignedSize вернется размер необходимого буфера.
dSignedSize -
на входе - указатель на размер буфера, на который указывает chSignedMes,
на выходе -
при возвращении функцией FALSE или 0:
0 - при ошибке и
размер необходимого буфера при chSignedMes=NULL или малом значении dSignedSize
при возвращении функцией TRUE или 1 - размер подписанного и сконвертированного сообщения, записанного в буфер chSignedMes

я ее описываю в C# следующим образом:

 
Код:
[DllImport("SignLib.dll")]
private static  extern bool DoSign(
            Int32 dSI,
            Int32 dPI,
            byte[] message,
            Int32 dMesSize,
            [MarshalAs(UnmanagedType.LPArray)]ref byte[] chSignedMes,
            ref Int32 dSignedSize);


вызываю так:


Код:
DoSign(
   Int32.Parse(cfg.ClientID),
   Int32.Parse(cfg.PosID),
   Encoding.Unicode.GetBytes(message),
   Encoding.Unicode.GetBytes(message).Length,
   ref chSignedMes,
   ref dSignedSize);
chSignedMes = new byte[dSignedSize];

DoSign(
   Int32.Parse(cfg.ClientID),
   Int32.Parse(cfg.PosID),
   Encoding.ASCII.GetBytes(message),
   Encoding.ASCII.GetBytes(message).Length,
   ref chSignedMes,
   ref dSignedSize)


и после всего этого в chSignedMes всего один символ, хотя dSignedSize=259
Вроде уже перепробовал все, что мог... :(

Буду благодарен за любую помощь!
1
14 мая 2008 года
kot_
7.3K / / 20.01.2000
Проверьте - или в объявлении или в описании у вас ошибка:
...BYTE** chSignedMes...

chSignedMes - указатель на буфер
т.е. должно быть:
BYTE *chSignedMes?
указатель на указатель и указатель на буфер - ИМХО не совсем одно и тоже.
Возможно в этом и ошибка? Посмотрите как функция на самом деле экспортируеться.
33K
14 мая 2008 года
Padavan1
15 / / 07.05.2008
может описание и с огрехами, но библиотека точно рабочая...
к сожалению, не могу посмотреть исходники тк есть только dll.

на данный момент справился с импортом с помощью неуправляемого кода (unsafe), но вот новая проблема, при выходе из функции, где все это дело делается, вылетает exception:

The runtime has encountered a fatal error. The address of the error was at 0x7a2b5aec, on thread 0x1478. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.

может знаете в чем проблема, ибо я теряюсь(

код теперь выглядит так:
Код:
public static string GetSignedMsg(string message, ConfigInfo cfg)
        {
            string res = "";
           
            unsafe
            {
                try
                {
                    if (!InitLib(
                        cfg.KeyFilePath,
                        Int32.Parse(cfg.ClientID),
                        Int32.Parse(cfg.PosID),
                        false,
                        cfg.PrivateKeyPsw))
                    {
                        return null;
                    }
                    int dSignedSize = 0;
                    byte chSignedMes;
                    byte* PchSignedMes = &chSignedMes;
                   

                    DoSign(
                        Int32.Parse(cfg.ClientID),
                        Int32.Parse(cfg.PosID),
                        //Encoding.Unicode.GetBytes(message),
                        //Encoding.Unicode.GetBytes(message).Length,
                        message,
                        message.Length,
                        &PchSignedMes,
                        ref dSignedSize);
                    int j = dSignedSize;
                    //chSignedMes = new byte[dSignedSize];
                    //chSignedMes=new StringBuilder();
                   

                    if (!DoSign(
                        Int32.Parse(cfg.ClientID),
                        Int32.Parse(cfg.PosID),
                        //Encoding.Unicode.GetBytes(message),
                        //Encoding.Unicode.GetBytes(message).Length,
                        message,
                        message.Length,
                        &PchSignedMes,
                        ref dSignedSize))
                    {
                        return null;
                    }
                    byte[] data = new byte[j];
                    for (int i = 0; i < j; i++)
                    {
                        data = *PchSignedMes;
                        PchSignedMes++;
                    }

                   
                    //string str = Encoding.ASCII.GetString(data);
                    //res = str;        
                    Deinit();
                    return Encoding.ASCII.GetString(data);
                }

                catch (Exception ex)
                {
                    Console.Write(ex.ToString());
                }
            }
           
            return res;

        }
1
14 мая 2008 года
kot_
7.3K / / 20.01.2000
Во-первых - в опциях проекта установлена опция работать с неуправляемым кодом?
Во вторых - посмотрите - что все же экспортирует ваша длл. Для этого исходники не нужны.
После рабочего дня голова уже не варит - потому ничего не могу сказать по поводу его корректности - если в инете есть описание библиотеки - кинте - с утра гляну.
33K
14 мая 2008 года
Padavan1
15 / / 07.05.2008
1) установлено
2) если б знал как, то посмотрел... )
3) вряд ли описание библиотеки есть в интернете, тк она была написана фирмой-клиентом для своих криптографических нужд. по крайней мере гугл о ней ничего не знает...
12K
14 мая 2008 года
lifs
163 / / 06.09.2007
ошибка в коде. следующий код писать не надо:
 
Код:
byte chSignedMes;
byte* PchSignedMes = &chSignedMes;

в данном месте был объявлен байт и указатель на него, а надо указатель на массив размера chSignedMes.
Поэтому при первом вызове функции DoSign(...) вместо PchSignedMes надо передавать 0, а перед вторым вызовом нужно написать:
 
Код:
byte* PchSignedMes = stackalloc byte[dSignedSize];

и передавать &PchSignedMes.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог