C#-可能使用IOCTL

C#-可能使用IOCTL,c#,dllimport,handle,ioctl,kernel32,C#,Dllimport,Handle,Ioctl,Kernel32,我正在尝试为销售点系统编码,该系统允许“现金抽屉”附件。代码在手册中提供,用于打开现金抽屉(在C++中使用IOCTL)。由于我是在C#.NET中编写代码,是否可以在C#中执行类似的操作,或者我必须编写一些非托管代码 我能从C#中获得“\\.\ADVANSYS”的句柄吗?我需要使用DLLImport吗 如果有人能给我指出正确的方向,我将不胜感激 // IOCTL Codes #define GPD_TYPE 56053 #define ADV_OPEN_CTL_CODE CTL_CODE(GPD_

我正在尝试为销售点系统编码,该系统允许“现金抽屉”附件。代码在手册中提供,用于打开现金抽屉(在C++中使用IOCTL)。由于我是在C#.NET中编写代码,是否可以在C#中执行类似的操作,或者我必须编写一些非托管代码

我能从C#中获得“\\.\ADVANSYS”的句柄吗?我需要使用DLLImport吗

如果有人能给我指出正确的方向,我将不胜感激

// IOCTL Codes
#define GPD_TYPE 56053
#define ADV_OPEN_CTL_CODE CTL_CODE(GPD_TYPE, 0x920, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define ADV_STATUS_CTL_CODE CTL_CODE(GPD_TYPE, 0x900, METHOD_BUFFERED, FILE_ANY_ACCESS)
void OpenDrawer(UCHAR uWhichDrawer) // uWhichDrawer = 1 => CD#1, uWhichDrawer = 2 => CD#2
{
    HANDLE hFile;
    BOOL bRet
    UCHAR uDrawer = uWhichDrawer;

    // Open the driver
    hFile = CreateFile(TEXT("\\\\.\\ADVSYS"),
    GENERIC_WRITE | GENERIC_READ,
    FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

    if (m_hFile == INVALID_HANDLE_VALUE)
    {
        AfxMessageBox("Unable to open Cash Drawer Device Driver!");
        return;
    }

    // Turn on the Cash Drawer Output (Fire the required solenoid)
    bRet = DeviceIoControl(hFile, ADV_CD_OPEN_CTL_CODE,
    &uDrawer, sizeof(uDrawer),
    NULL, 0,
    &ulBytesReturned, NULL);

    if (bRet == FALSE || ulBytesReturned != 1)
    {
        AfxMessageBox("Failed to write to cash drawer driver");
        CloseHandle(hFile);
        return;
    }
    CloseHandle(hFile);
}
你可以使用


也有帮助。

< P> C++中有很多错误,如果我猜对了,我不确定。最好的方法是使用修改过的参数类型声明DeviceIoControl(),以便调用它。您还必须P/Invoke CreateFile,因为FileStream无法打开设备。它应该看起来像这样:

using System;
using System.IO;
using System.ComponentModel;
using System.Runtime.InteropServices;

class Program {
    static void Main(string[] args) {
        IntPtr hdl = CreateFile("\\\\.\\ADVSYS", FileAccess.ReadWrite,
            FileShare.None, IntPtr.Zero, FileMode.Open,
            FileOptions.None, IntPtr.Zero);
        if (hdl == (IntPtr)(-1)) throw new Win32Exception();
        try {
            byte drawer = 1;
            bool ok = DeviceIoControl(hdl, CTLCODE, ref drawer, 1, IntPtr.Zero,
                0, IntPtr.Zero, IntPtr.Zero);
            if (!ok) throw new Win32Exception();
        }
        finally {
            CloseHandle(hdl);
        }
    }
    // P/Invoke:
    private const uint CTLCODE = 0xdaf52480;
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr CreateFile(string filename, FileAccess access,
          FileShare sharing, IntPtr SecurityAttributes, FileMode mode,
          FileOptions options, IntPtr template
    );
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool DeviceIoControl(IntPtr device, uint ctlcode,
        ref byte inbuffer, int inbuffersize,
        IntPtr outbuffer, int outbufferSize,
        IntPtr bytesreturned, IntPtr overlapped
    );
    [DllImport("kernel32.dll")]
    private static extern void CloseHandle(IntPtr hdl);
}

在pinvoke.net上有大量的代码和大量的示例

你写道:

似乎GPD_56053型 如文件中所述 我说的不对

您能发布GPD\U类型的正确值吗


最好的富豪

谢谢汉斯·帕桑。我现在能够成功打开设备驱动程序,但调用DeviceIoControl会产生“Win32Exception:连接到系统的设备无法运行”。我相信这可能是传入的变量之一(或类型)或缓冲区的长度。我会继续看我是否能让它工作。现在一切都好了。谢谢你的帮助。我所拥有的文档中指定的GPD_类型56053似乎不正确。
using System;
using System.IO;
using System.ComponentModel;
using System.Runtime.InteropServices;

class Program {
    static void Main(string[] args) {
        IntPtr hdl = CreateFile("\\\\.\\ADVSYS", FileAccess.ReadWrite,
            FileShare.None, IntPtr.Zero, FileMode.Open,
            FileOptions.None, IntPtr.Zero);
        if (hdl == (IntPtr)(-1)) throw new Win32Exception();
        try {
            byte drawer = 1;
            bool ok = DeviceIoControl(hdl, CTLCODE, ref drawer, 1, IntPtr.Zero,
                0, IntPtr.Zero, IntPtr.Zero);
            if (!ok) throw new Win32Exception();
        }
        finally {
            CloseHandle(hdl);
        }
    }
    // P/Invoke:
    private const uint CTLCODE = 0xdaf52480;
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr CreateFile(string filename, FileAccess access,
          FileShare sharing, IntPtr SecurityAttributes, FileMode mode,
          FileOptions options, IntPtr template
    );
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool DeviceIoControl(IntPtr device, uint ctlcode,
        ref byte inbuffer, int inbuffersize,
        IntPtr outbuffer, int outbufferSize,
        IntPtr bytesreturned, IntPtr overlapped
    );
    [DllImport("kernel32.dll")]
    private static extern void CloseHandle(IntPtr hdl);
}