Вызов функции 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()