針對 POS 列印機並行埠通訊,結合 WQL 查詢基址、inpout32.dll 讀取狀態、Win32 API 寫入資料,實作完整 ParallelPort 類別。
public class ParallelPort : IPort, IDisposable {
// inpout32 匯入
[DllImport("inpout32.dll")] private static extern void Out32(uint address, int value);
[DllImport("inpout32.dll")] private static extern int Inp32(uint address);
// Win32 API 寫入
[DllImport("kernel32.dll")] private static extern int CreateFile(...);
[DllImport("kernel32.dll")] private static extern bool WriteFile(...);
// WQL 查詢基址
internal ParallelPort(string portName) {
this.Name = portName;
var searcher = new ManagementObjectSearcher(
"ASSOCIATORS OF {Win32_ParallelPort.DeviceID='" + portName + "'}");
foreach (var obj in searcher.Get()) {
if (obj.ClassPath.ClassName == "Win32_PortResource") {
BasePort = Convert.ToUInt32(obj.Properties["StartingAddress"].Value);
break;
}
}
}
public void Open() {
iHandle = CreateFile(Name, GENERIC_WRITE, 0, 0, 3, 0, 0);
IsOpen = (iHandle != -1);
new Thread(ReadState).Start(); // 背景輪詢狀態
}
// Read/Write/Close/Dispose 實作略...
}
解決並行埠基址非固定、需即時狀態監控的實務難題。