C# SetFilePointer奇怪的问题
我正在尝试从物理驱动器读取扇区。但设置文件指针在一段时间后出现了一些奇怪的错误C# SetFilePointer奇怪的问题,c#,C#,我正在尝试从物理驱动器读取扇区。但设置文件指针在一段时间后出现了一些奇怪的错误 [DllImport("kernel32.dll", EntryPoint = "SetFilePointer", CallingConvention = CallingConvention.StdCall)] static extern uint SetFilePointer( [In] IntPtr hFile, [In] int lDist
[DllImport("kernel32.dll", EntryPoint = "SetFilePointer", CallingConvention = CallingConvention.StdCall)]
static extern uint SetFilePointer(
[In] IntPtr hFile,
[In] int lDistanceToMove,
[In,Out] int lpDistanceToMoveHigh,
[In] EMoveMethod dwMoveMethod);
public void SetFilePointer(LARGE_INTEGER li)
{
SetFilePointer((IntPtr)handle, li.LowPart, li.HighPart, EMoveMethod.Begin);
}
//values
HighPart 381 int
LowPart -1323466752 int
如果将highPart传递为零,则其工作。在C版本中,它可以无任何问题地下载。但在c#版本中,当ever highvalue不为零时,会出现异常
其他信息:尝试读取或写入受保护内存。
这通常表示其他内存已损坏
你能提出修改意见吗
更新已解决
正如@mjwills建议的,我必须将签名更改为
[DllImport("kernel32.dll", EntryPoint = "SetFilePointer")]
static extern uint SetFilePointer(
[In] Microsoft.Win32.SafeHandles.SafeFileHandle hFile,
[In] int lDistanceToMove,
[In, Out] ref int lpDistanceToMoveHigh,
[In] EMoveMethod dwMoveMethod);
public void SetFilePointer(LARGE_INTEGER li)
{
SetFilePointer(shandle, li.LowPart, ref li.HighPart, EMoveMethod.Begin);
}
你能告诉我们为什么需要调用这个特定的API吗?以防万一这是一个XY问题-。您的声明与中所示的相同吗?@mjwills no让我试试signature@mjwills感谢您的指导,现在可以工作了。我更改了您提到的签名。第三个参数是错误的,它必须是
ref int
。错误版本只在高部分为0时才起作用,然后函数假定传递了NULL。请注意,这并不是对FileStream.Seek()的改进。FileStream具有处理异常情况的构造函数。