Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Abend
0 / 0 / 0
Регистрация: 19.08.2015
Сообщений: 8
1

Вызов функции Delphi с аргументом Pointer на C#

26.01.2017, 15:18. Просмотров 252. Ответов 3
Метки нет (Все метки)

В старом проекте на Delphi 7 есть функция SLUpdateMemoryHash которая вызывается из внешней dll.
Пытаюсь реализовать вызов даной на .Net C#. Проблема реализации передачи параметра типа Pointer.
В чем может быть ошибка?
Описание на Delphi:
Delphi
1
2
3
function SLUpdateMemoryHash(hCtx: HSECLIB; 
                            const pData: Pointer;
                            nDataSize: Cardinal): SLSTATUS ; stdcall ;
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function DoHashFile( hCtx : HSECLIB;
                        hFileIn: THandle ;
            hFileOut: THandle;
                        pBuffer: Pointer ;
                        nSize : Cardinal  ): SLSTATUS ;
var
    processed : DWORD ;
begin
    ReadFile( hFileIn, pBuffer^, nSize, processed, Nil );
 
    Result := SLUpdateMemoryHash( hCtx, pBuffer, nSize ) ;//Как выполнить подобное в C#
 
    WriteFile( hFileOut, pBuffer^, nSize, processed, Nil ); 
end;
Попытка вызвать функцию SLUpdateMemoryHash на C#:
C#
1
2
3
4
5
6
7
8
[StructLayout(LayoutKind.Sequential)]
public struct HSECLIB__
{
       public int unused;
}
 
[DllImport("SecLibrary.dll", CallingConvention = CallingConvention.StdCall)]
static extern uint SLUpdateMemoryHash(HSECLIB__ hCtx, IntPtr bytePointer, uint nDataSize);
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Sender
{
    public Sender()
    {
        HSECLIB__ hSecLib2 = new HSECLIB__();
        string sFileIn = @"e:\text.txt";
        string sFileOut = @"e:\text.sign";
        FileStream fsIn = new FileStream(sFileIn, FileMode.Open);
        FileStream fsOut = new FileStream(sFileOut, FileMode.Create);
        long bufSize = fsIn.Length;
        byte[] byteBuf = new byte[bufSize];
 
        int countRead = fsIn.Read(bytePointer, 0, bufSize);    
 
        IntPtr unmanagedPointer = Marshal.AllocHGlobal(byteBuf.Length);
        Marshal.Copy(bytePointer, 0, unmanagedPointer, byteBuf.Length);
 
        int rez = SLUpdateMemoryHash(hSecLib2, unmanagedPointer, bufSize); //В чем ошибка?
        //if (rez != 0) { WriteLog("Ошибка SLUpdateMemoryHash"); }
 
        byte[] outBytes = new byte[bufSize];
        Marshal.Copy(unmanagedPointer, outBytes, 0, byteBuf.Length);
 
        fsOut.Write(bytePointer, 0, outBytes.Length);
        fsOut.Flush();
        fsOut.Close();
        fsIn.Close();
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2017, 15:18
Ответы с готовыми решениями:

Вызов функции из DLL, написанной на Delphi
Здрасте, У меня тут такая ситуация: Рыскал как то я, по просторам интернета,...

Вызов dll на Delphi из C#
Здравствуйте! Я понимаю, что проблема старая, я много прочитал по этому...

Вызов dll Delphi из C#
Почему выскакивает ошибка An unhandled exception of type...

Вызов функции из функции в виде функция1(функция2)
Всем привет, название говорит само за себя. FunctionEnabler(somefunction);

Вызов функции javascript с аргументом из php кода
Подскажите как правильно вызвать функцию javascript из php и передать ей...

3
NickoTin
Почетный модератор
Эксперт .NET
8446 / 3568 / 402
Регистрация: 14.06.2010
Сообщений: 4,512
Записей в блоге: 9
27.01.2017, 03:06 2
Цитата Сообщение от Abend Посмотреть сообщение
//В чем ошибка?
А она в чем-то выражена? Исключение там или неверный расчет, или еще что-то... Вы нам предлагаете гадать?

На взгляд:
1. Уверены что HSECLIB это именно 32-битный тип, а не IntPtr например?
2. Не вижу чтобы hSecLib2 принимал какое-то значение. Судя по Delphi коду это контекст и наверняка он где-то инициализруется.
3. Не ошибка, но всё же - IntPtr bytePointer можно заменить на byte[] bytePointer.
1
Abend
0 / 0 / 0
Регистрация: 19.08.2015
Сообщений: 8
27.01.2017, 11:10  [ТС] 3
Цитата Сообщение от NickoTin Посмотреть сообщение
1. Уверены что HSECLIB это именно 32-битный тип, а не IntPtr например?
Delphi
1
2
3
4
type
  HSECLIB__ = record
       unused : Integer;
end;
Цитата Сообщение от NickoTin Посмотреть сообщение
2. Не вижу чтобы hSecLib2 принимал какое-то значение. Судя по Delphi коду это контекст и наверняка он где-то инициализруется.
Это контекст библиотеки по работе с ЭЦП. С ним все ок.

Цитата Сообщение от NickoTin Посмотреть сообщение
3. Не ошибка, но всё же - IntPtr bytePointer можно заменить на byte[] bytePointer.
А насколько корректно будет использование следующей конструкции с GCHandle.Alloc?
C#
1
2
3
4
5
byte[] byteBuf = new byte[bufSize];
var handle = GCHandle.Alloc(byteBuf, GCHandleType.Pinned);
IntPtr ptr = GCHandle.ToIntPtr(handle);
rez = SLUpdateMemoryHash(hSecLib2, (IntPtr)handle, 21);
handle.Free()
;
0
NickoTin
Почетный модератор
Эксперт .NET
8446 / 3568 / 402
Регистрация: 14.06.2010
Сообщений: 4,512
Записей в блоге: 9
27.01.2017, 12:28 4
Цитата Сообщение от Abend Посмотреть сообщение
А насколько корректно будет использование следующей конструкции с GCHandle.Alloc?
Корректно, если замените GCHandle.ToIntPtr(handle) на handle.AddrOfPinnedObject(), ну и в приведении (IntPtr)handle нет необходимости.

Цитата Сообщение от Abend Посмотреть сообщение
Это контекст библиотеки по работе с ЭЦП. С ним все ок.
Ок, но пустой контекст это крайне подозрительно.

Abend, вы всё-же не ответили, как проявляется ошибка.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2017, 12:28

Многократный вызов пользовательской функции с аргументом типа Range - как исправить?
Добрый день, уважаемые форумчане! Уже третий день бьюсь над следующей...

Реализовать вызов конструктора с одним аргументом, запретив остальные варианты
Как сделать, чтобы конструктор можно было вызвать только одним способом: //Так...

Вызов функции из dll написанной на delphi из python
Импортировал ctypes, подключился к dll. Есть например такая функция: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru