Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# для начинающих

Войти
Регистрация
Восстановить пароль
 
Abend
0 / 0 / 0
Регистрация: 19.08.2015
Сообщений: 8
#1

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

26.01.2017, 15:18. Просмотров 207. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вызов функции Delphi с аргументом Pointer на C# (C#):

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

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

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

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

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

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

3
NickoTin
Почетный модератор
Эксперт .NET
8434 / 3556 / 240
Регистрация: 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
8434 / 3556 / 240
Регистрация: 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
Привет! Вот еще темы с ответами:

Delphi Cheat Engine Pointer Offset - Delphi
Pointer Offset помогите собрать пож) BF3.EXE+B1FD21 5C <offset1 0 <offset2 74 <offset3 22 <offset4

Delphi и ASM - не работает вызов функции Invoke через asm - Assembler
В Delphi не работает вызов функции Invoke через asm. часть кода: asm invoke CloseHandle,ebx; invoke ExitProcess,0; ...

Передача динамической структуры аргументом функции - C++
Помогите, пожалуйста, обнаружить и исправить ошибки. Точнее, компилятор-то их отыскивает, но в чем именно ошибка, в какой идее, синтаксисе...

Invalid pointer operation при запуске Delphi 7 под Windows 7 - Delphi
При запуске Delphi 7 под Windows 7 получаю сообщение "Invalid pointer operation", хотя еще ничего не создано и не открыто. Необходимые...


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

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

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