Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 19.08.2015
Сообщений: 8

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

26.01.2017, 15:18. Показов 2090. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.01.2017, 15:18
Ответы с готовыми решениями:

Вызов функции с аргументом
Привет. Пытаюсь сделать так, чтобы определенный блок появлялся при нажатии на кнопку, а все остальные скрывались. Сделал через аргумент, но...

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

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

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

На взгляд:
1. Уверены что HSECLIB это именно 32-битный тип, а не IntPtr например?
2. Не вижу чтобы hSecLib2 принимал какое-то значение. Судя по Delphi коду это контекст и наверняка он где-то инициализруется.
3. Не ошибка, но всё же - IntPtr bytePointer можно заменить на byte[] bytePointer.
1
0 / 0 / 0
Регистрация: 19.08.2015
Сообщений: 8
27.01.2017, 11:10  [ТС]
Цитата Сообщение от 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
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
27.01.2017, 12:28
Цитата Сообщение от Abend Посмотреть сообщение
А насколько корректно будет использование следующей конструкции с GCHandle.Alloc?
Корректно, если замените GCHandle.ToIntPtr(handle) на handle.AddrOfPinnedObject(), ну и в приведении (IntPtr)handle нет необходимости.

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

Abend, вы всё-же не ответили, как проявляется ошибка.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.01.2017, 12:28
Помогаю со студенческими работами здесь

Не работает вызов метода с аргументом std::tuple
https://cdn.discordapp.com/attachments/357887918183940096/553908486015156225/unknown.png ...

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

Реализовать вызов конструктора с одним аргументом, запретив остальные варианты
Как сделать, чтобы конструктор можно было вызвать только одним способом: //Так можно MyClass x = MyClass(a); //Так нельзя MyClass x...

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

Копирование файла, указанного первым аргументом, в папку, часть пути к которой указана вторым аргументом
Добрый день. Есть два задания из лабораторной работы. Я бы с радостью их сделал где угодно, кроме cmd, но увы. Есть структура: ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru