Вызов функции 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()
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д