[DllImport("kernel32.dll", SetLastError=true)]
public static extern unsafe bool WriteFile(IntPtr hFile, void* lpBuffer, uint nNumberOfBytesToWrite, out uint lpNumberOfBytesWritten, IntPtr lpOverlapped);
我通过写(..)方法的签名实现这个:实施的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;
}
}
正如我学会了看this (the use of the read counterpart is discussed)我需要实现我的代码while循环,因为缓冲区的写入/读取可能无法一次完成。这是问题开始的地方:
如果我想保留我的C#方法签名以接受void *,与链接的Read示例中的byte *被接受为缓冲区的参数不同。
这意味着在WriteFile的一次传递之后,我应该将void *移动到尚未写入的缓冲区的开始处。我不明白这是通过增加void *来保存写入字节数的uint来实现的......我明白void *没有预先确定的大小,因此增量是不可能的,但是我不知道我应该如何实现我正在努力。
当您可以使用System.IO命名空间提供的内容时,是否有任何理由使用Win32 api不安全代码? – 2009-11-02 14:23:16
是的,扩展我对原生东西/互操作的了解,并理解.net通常隐藏的东西。我从来没有被教过什么,我称之为“基本”的东西(指针,...),我非常想学习。 – Kris 2009-11-02 14:32:58
@Kris:如果您想了解指针和低级别的东西,我会使用低级语言(C,C++,(QT,wxWidgets)),而不是尝试从高级到低级别语言。 – Bobby 2009-11-02 14:49:11