[DllImport("kernel32.dll", SetLastError=true)]
public static extern unsafe bool WriteFile(IntPtr hFile, void* lpBuffer, uint nNumberOfBytesToWrite, out uint lpNumberOfBytesWritten, IntPtr lpOverlapped);
私はこれを署名付きのWrite(..)メソッドを介して実装しています:
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;
}
}
これを見て学んだように(読み取りの対応物の使用について説明します)、バッファーの書き込み/読み取りが一度に実行されない可能性があるため、コードにwhileループを実装する必要があります。ここから問題が始まります。
バイト*がバッファーのパラメーターとして受け入れられるリンクされた読み取りの例とは異なり、void *を受け入れるようにC#メソッドの署名を保持したい場合。
これは、WriteFileを1回パスした後、まだ書き込まれていないバッファの先頭にvoid*を移動する必要があることを意味します。書き込まれたバイト数を保持するuintでvoid*をインクリメントするだけでは、どうやらこれを行うことはできません... void *には所定のサイズがないため、インクリメントできないことは理解していますが、どうすれば達成できるのでしょうか。私はやろうとしています。