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

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

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

В старом проекте на Delphi 7 есть функция SLUpdateMemoryHash которая вызывается из внешней dll. Пытаюсь реализовать вызов даной на .Net C#. Проблема реализации передачи параметра типа Pointer. В чем может быть ошибка? Описание на Delphi:
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;
Попытка вызвать функцию SLUpdateMemoryHash на C#:
[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()

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


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

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

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