powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вызов функции Delphi с аргументом Pointer на C#
4 сообщений из 4, страница 1 из 1
Вызов функции Delphi с аргументом Pointer на C#
    #39392127
Uzrptav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В старом проекте на Delphi 7 есть функция SLUpdateMemoryHash которая вызывается из внешней dll.
Пытаюсь реализовать вызов даной на .Net C#. Проблема реализации передачи параметра типа Pointer.
В чем может быть ошибка?
Описание на Delphi:
Код: pascal
1.
2.
3.
function SLUpdateMemoryHash(hCtx: HSECLIB; 
                            const pData: Pointer;
                            nDataSize: Cardinal): SLSTATUS ; stdcall ;


Реализация на Delphi:
Код: pascal
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 / 0
Вызов функции Delphi с аргументом Pointer на C#
    #39392355
Т-Миронов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибка в том, что не вызывается Marshal.FreeHGlobal.
А вообще вместо этого:
Код: c#
1.
2.
        IntPtr unmanagedPointer = Marshal.AllocHGlobal(byteBuf.Length);
        Marshal.Copy(bytePointer, 0, unmanagedPointer, byteBuf.Length);


Удобней
Код: c#
1.
2.
3.
4.
var handle = GCHandle.Alloc(byteBuf, GCHandleType.Pinned);
IntPtr ptr = GCHandle.ToIntPtr(handle);
...
handle.Free();



А в чем проблемма? Текст ошибки или не тот результат rez ?
...
Рейтинг: 0 / 0
Вызов функции Delphi с аргументом Pointer на C#
    #39392372
Uzrptav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема в том, что на стороне Delphi функция SLUpdateMemoryHash требует аргумент типа Pointer - указатель на буфер в который считывается порция байтов из файла.
Не могу понять как правильно реализовать вызов SLUpdateMemoryHash на .NET C# и передать указатель на массив байт byteBuf который я получаю:
Код: c#
1.
2.
3.
4.
        FileStream fsIn = new FileStream(sFileIn, FileMode.Open);
        long bufSize = fsIn.Length;
        byte[] byteBuf = new byte[bufSize];
        int countRead = fsIn.Read(byteBuf, 0, bufSize);    
...
Рейтинг: 0 / 0
Вызов функции Delphi с аргументом Pointer на C#
    #39392374
Т-Миронов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UzrptavПроблема в том, что на стороне Delphi функция SLUpdateMemoryHash требует аргумент типа Pointer - указатель на буфер в который считывается порция байтов из файла.
Не могу понять как правильно реализовать вызов SLUpdateMemoryHash на .NET C# и передать указатель на массив байт byteBuf который я получаю:
Код: c#
1.
2.
3.
4.
        FileStream fsIn = new FileStream(sFileIn, FileMode.Open);
        long bufSize = fsIn.Length;
        byte[] byteBuf = new byte[bufSize];
        int countRead = fsIn.Read(byteBuf, 0, bufSize);    



Это не проблема а задача. И приведение решение ее для меня выглядит рабочим. Если онон не работает давайте разбираться почему глядя на симптомы.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вызов функции Delphi с аргументом Pointer на C#
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]