Вызов функции Delphi с аргументом Pointer на C#
Формулировка задачи:
В старом проекте на Delphi 7 есть функция SLUpdateMemoryHash которая вызывается из внешней dll.
Пытаюсь реализовать вызов даной на .Net C#. Проблема реализации передачи параметра типа Pointer.
В чем может быть ошибка?
Описание на Delphi:
Попытка вызвать функцию SLUpdateMemoryHash на C#:
Листинг программы
- function SLUpdateMemoryHash(hCtx: HSECLIB;
- const pData: Pointer;
- nDataSize: Cardinal): SLSTATUS ; stdcall ;
Листинг программы
- 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;
Листинг программы
- [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);
Листинг программы
- 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();
- }
- }
Решение задачи: «Вызов функции Delphi с аргументом Pointer на C#»
textual
Листинг программы
- 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()
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д