Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未处理USB AccessViolationException中的C#.NET读取文件_C#_.net_Usb_Dllimport_Readfile - Fatal编程技术网

未处理USB AccessViolationException中的C#.NET读取文件

未处理USB AccessViolationException中的C#.NET读取文件,c#,.net,usb,dllimport,readfile,C#,.net,Usb,Dllimport,Readfile,调用ReadFile API时,我收到一个AccessViolationException。我查看了StackOverflow上处理类似问题的所有条目,但没有成功地破译出错误 以下是相关代码: 调用 [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern IntPtr CreateFile([MarshalAs(UnmanagedType.LPTStr)] stri

调用ReadFile API时,我收到一个
AccessViolationException
。我查看了StackOverflow上处理类似问题的所有条目,但没有成功地破译出错误

以下是相关代码:

调用

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr CreateFile([MarshalAs(UnmanagedType.LPTStr)] string filename, UInt32 desiredaccess, UInt32 sharemode, IntPtr securityattributes, UInt32 creationdisposition, UInt32 flagsandattributes, IntPtr templatefile);

[DllImport("kernel32.dll", BestFitMapping = true, CharSet = CharSet.Ansi, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool ReadFile(IntPtr hFile, out byte[] lpbuffer, UInt32 nNumberofBytesToRead, out UInt32 lpNumberofBytesRead, IntPtr lpOverlapped);

[DllImport("kernel32.dll", BestFitMapping = true, CharSet = CharSet.Ansi, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool WriteFile(IntPtr hFile, byte[] lpBuffer, UInt32 nNumberOfBytesToWrite, out UInt32 lpNumberOfBytesWritten, IntPtr lpOverlapped);
创建文件函数调用

private IntPtr OpenPort(string port)
    {
        IntPtr printerhandle = IntPtr.Zero;

        printerhandle = CreateFile(port, 
                            (UInt32)(FileAccess.GENERIC_READ | FileAccess.GENERIC_WRITE), 
                            (UInt32)(FileShare.FILE_SHARE_READ | FileShare.FILE_SHARE_WRITE), 
                            IntPtr.Zero, 
                            (UInt32)FileMode.OPEN_EXISTING, 
                            (UInt32)(FileAttribute.FILE_ATTRIBUTE_NORMAL), 
                            IntPtr.Zero);

        return (printerhandle);
    }
private bool WriteToPort(IntPtr printer, ref byte[] data)
    {
        bool success = true;
        byte[] data2 = new byte[64];
        byte[] dataread = new byte[64];
        int index = 0;
        int length = 64;
        uint written = 0;
        uint read = 0;

        while ((index + length) <= data.Length)
        {
            Array.Copy(data, index, data2, 0, length);
            success &= WriteFile(printer, data2, (uint)length, out written, IntPtr.Zero);
            index += 64;
        }

        if ((index < data.Length) &&
            ((index + length) > data.Length))
        {
            length = data.Length - index;
            Array.Copy(data, index, data2, 0, length);
            success &= WriteFile(printer, data2, (uint)length, out written, IntPtr.Zero);
        }

        success &= ReadFile(printer, out dataread, 64, out read, IntPtr.Zero);

        return success;
    }
读取文件函数调用

private IntPtr OpenPort(string port)
    {
        IntPtr printerhandle = IntPtr.Zero;

        printerhandle = CreateFile(port, 
                            (UInt32)(FileAccess.GENERIC_READ | FileAccess.GENERIC_WRITE), 
                            (UInt32)(FileShare.FILE_SHARE_READ | FileShare.FILE_SHARE_WRITE), 
                            IntPtr.Zero, 
                            (UInt32)FileMode.OPEN_EXISTING, 
                            (UInt32)(FileAttribute.FILE_ATTRIBUTE_NORMAL), 
                            IntPtr.Zero);

        return (printerhandle);
    }
private bool WriteToPort(IntPtr printer, ref byte[] data)
    {
        bool success = true;
        byte[] data2 = new byte[64];
        byte[] dataread = new byte[64];
        int index = 0;
        int length = 64;
        uint written = 0;
        uint read = 0;

        while ((index + length) <= data.Length)
        {
            Array.Copy(data, index, data2, 0, length);
            success &= WriteFile(printer, data2, (uint)length, out written, IntPtr.Zero);
            index += 64;
        }

        if ((index < data.Length) &&
            ((index + length) > data.Length))
        {
            length = data.Length - index;
            Array.Copy(data, index, data2, 0, length);
            success &= WriteFile(printer, data2, (uint)length, out written, IntPtr.Zero);
        }

        success &= ReadFile(printer, out dataread, 64, out read, IntPtr.Zero);

        return success;
    }

对可能发生的事情有什么想法吗?

因为您对
ReadFile
函数的声明错误。从
lpbuffer
参数中删除
out

导入读取文件:

[DllImport("kernel32.dll", BestFitMapping = true, CharSet = CharSet.Ansi, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool ReadFile(IntPtr hFile, byte[] lpbuffer, UInt32 nNumberofBytesToRead, out UInt32 lpNumberofBytesRead, IntPtr lpOverlapped);
读取文件:

success &= ReadFile(printer, dataread, 64, out read, IntPtr.Zero);

谢谢这就成功了。是什么让你觉得这是问题所在?另外,我会给你一个投票,但我的名声还不太好。
out
对于引用类型意味着内存将由被调用方分配,数组是引用类型
ReadFile
不为
lpbuffer
分配内存。它只将文件中的字节复制到您提供的缓冲区。因此,
out
关键字不能使用。