[DllImport("kernel32.dll", SetLastError=true)]
public static extern unsafe bool WriteFile(IntPtr hFile, void* lpBuffer, uint nNumberOfBytesToWrite, out uint lpNumberOfBytesWritten, IntPtr lpOverlapped);
: 나는 this (the use of the read counterpart is discussed)보고 배운 것처럼 내 코드에서 while 루프를 구현해야구현에서 Win32 FILEWRITE
Write(IntPtr handleFile, void* bufferData, uint length){
void* buffer = bufferData
while (length > 0)
{
uint wrtn;
if (!WriteFile(handle, buffer, len, out wrtn, IntPtr.Zero))
{
// Do some error handling
}
// THIS DOESNT WORK!
// I want to move along the buffer to be able to write its remainder...
// I tried many variations of this as well, but it seems even '+' is not valid for a void*
buffer += wrtn;
len -= wrtn;
}
}
때문에 한 번에 버퍼의 쓰기/읽기가 진행되지 않을 수도 있습니다. 문제가 시작되는 곳입니다 :
바이트를 버퍼의 매개 변수로 사용할 수있는 링크 된 읽기 예제와 달리 void *를 허용하도록 C# 메서드 서명을 유지하려고합니다.
이것은 WriteFile을 한 번 통과 한 후에 아직 작성되지 않은 버퍼의 시작 부분까지 내 void *를 이동해야 함을 의미합니다. 분명히 void *를 쓰는 바이트 수를 유지하는 void로 증가 시켜서이 작업을 수행 할 수 없습니다. void *가 미리 결정된 크기가 아니므로 증가가 불가능하다는 것을 이해하지만 어떻게하면 나는하려고 애쓴다.
System.IO 네임 스페이스와 함께 제공되는 것을 사용할 수있을 때 Win32 API 안전하지 않은 코드를 사용해야하는 이유가 있습니까? –
예, 네이티브 stuff/interop에 대한 지식을 넓히고 .net이 일반적으로 숨 깁니다. 나는 내가 "근본적인"물건 (포인터, ...)이라고 부르는 것을 결코 배우지 못했고, 나는 배우고 싶다. – Kris
@Kris : 포인터 및 저급 항목에 대해 배우고 싶다면 저급 언어 (C, C++, (QT, wxWidgets))를 사용하고 하위 수준 언어. – Bobby