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

Узнай цену своей работы

Формулировка задачи:

В старом проекте на Delphi 7 есть функция SLUpdateMemoryHash которая вызывается из внешней dll. Пытаюсь реализовать вызов даной на .Net C#. Проблема реализации передачи параметра типа Pointer. В чем может быть ошибка? Описание на Delphi:
Листинг программы
  1. function SLUpdateMemoryHash(hCtx: HSECLIB;
  2. const pData: Pointer;
  3. nDataSize: Cardinal): SLSTATUS ; stdcall ;
Листинг программы
  1. function DoHashFile( hCtx : HSECLIB;
  2. hFileIn: THandle ;
  3. hFileOut: THandle;
  4. pBuffer: Pointer ;
  5. nSize : Cardinal ): SLSTATUS ;
  6. var
  7. processed : DWORD ;
  8. begin
  9. ReadFile( hFileIn, pBuffer^, nSize, processed, Nil );
  10. Result := SLUpdateMemoryHash( hCtx, pBuffer, nSize ) ;//Как выполнить подобное в C#
  11. WriteFile( hFileOut, pBuffer^, nSize, processed, Nil );
  12. end;
Попытка вызвать функцию SLUpdateMemoryHash на C#:
Листинг программы
  1. [StructLayout(LayoutKind.Sequential)]
  2. public struct HSECLIB__
  3. {
  4. public int unused;
  5. }
  6. [DllImport("SecLibrary.dll", CallingConvention = CallingConvention.StdCall)]
  7. static extern uint SLUpdateMemoryHash(HSECLIB__ hCtx, IntPtr bytePointer, uint nDataSize);
Листинг программы
  1. class Sender
  2. {
  3. public Sender()
  4. {
  5. HSECLIB__ hSecLib2 = new HSECLIB__();
  6. string sFileIn = @"e:\text.txt";
  7. string sFileOut = @"e:\text.sign";
  8. FileStream fsIn = new FileStream(sFileIn, FileMode.Open);
  9. FileStream fsOut = new FileStream(sFileOut, FileMode.Create);
  10. long bufSize = fsIn.Length;
  11. byte[] byteBuf = new byte[bufSize];
  12. int countRead = fsIn.Read(bytePointer, 0, bufSize);
  13. IntPtr unmanagedPointer = Marshal.AllocHGlobal(byteBuf.Length);
  14. Marshal.Copy(bytePointer, 0, unmanagedPointer, byteBuf.Length);
  15. int rez = SLUpdateMemoryHash(hSecLib2, unmanagedPointer, bufSize); //В чем ошибка?
  16. //if (rez != 0) { WriteLog("Ошибка SLUpdateMemoryHash"); }
  17. byte[] outBytes = new byte[bufSize];
  18. Marshal.Copy(unmanagedPointer, outBytes, 0, byteBuf.Length);
  19. fsOut.Write(bytePointer, 0, outBytes.Length);
  20. fsOut.Flush();
  21. fsOut.Close();
  22. fsIn.Close();
  23. }
  24. }

Решение задачи: «Вызов функции Delphi с аргументом Pointer на C#»

textual
Листинг программы
  1. byte[] byteBuf = new byte[bufSize];
  2. var handle = GCHandle.Alloc(byteBuf, GCHandleType.Pinned);
  3. IntPtr ptr = GCHandle.ToIntPtr(handle);
  4. rez = SLUpdateMemoryHash(hSecLib2, (IntPtr)handle, 21);
  5. handle.Free()

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.917 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут