我試圖編寫一個允許「現金抽屜」附件的銷售點系統。代碼在打開錢箱的手冊中提供(使用IOCTL在C++中)。由於我使用C#.NET進行編碼,是否可以在C#中執行類似的操作,還是必須編寫一些非託管代碼?C# - 可以使用IOCTL
我能從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);
}
感謝Hans Passant。我現在可以成功打開設備驅動程序,但調用DeviceIoControl會產生「Win32Exception:連接到系統的設備無法運行。」我相信它可能是傳入的變量之一(或類型)或緩衝區的長度。我會繼續看看我能否實現它。 – theblip 2010-05-24 00:27:29
知道現在所有的工作。謝謝你的幫助。看來,我的文檔中指定的GPD_TYPE 56053不正確。 – theblip 2010-05-24 12:15:00