由于工作原因,需要监视打印机状态(windows 上spooler),然后做取得一些关于打印机操作。
在VC++平台,问题很好解决,也有很好的平台解决方案,但是苦于要做成Windows Service和大量平台多线程处理(线程池),还有Tcp通信,xml配置等等,在C++上实现,我的编码效率低,用C#利用微软成熟的.net 4.0平台,时装比较快,我就采用了C# 来实现,但是问题来了,大量的spooler API 都是VC时代winAPI的非托管代码,怎用托管代码调用成了我一个棘手问题,因为业务是和打印机相关,C#关于打印机交互的接口我又不是很了解(不知道能不能实现),我就选择了折中方案,也是个危险的方案,就是用Marshal来解决问题。一旦解决不好,C#再好没鸟用,还得用C++,下面就是我查找和学习过程。
首先找到我基本要的调用的C++关于打印机winAPI都有哪些
在这里找:C++
#include <winspool.h>
#pragma comment(lib, "winspool.lib")
主要有一下进入winspool.h,有以下东东
BOOL
WINAPI
OpenPrinterW(
_In_opt_ LPWSTR pPrinterName,
_Out_ LPHANDLE phPrinter,
_In_opt_ LPPRINTER_DEFAULTSW pDefault
);
HANDLE
WINAPI
FindFirstPrinterChangeNotification(
_In_ HANDLE hPrinter,
DWORD fdwFilter,
DWORD fdwOptions,
_In_opt_ PVOID pPrinterNotifyOptions
);
BOOL
WINAPI
FindNextPrinterChangeNotification(
_In_ HANDLE hChange,
_Out_opt_ PDWORD pdwChange,
_In_opt_ LPVOID pvReserved,
_Out_opt_ LPVOID *ppPrinterNotifyInfo
);
BOOL
WINAPI
FindClosePrinterChangeNotification(
_In_ HANDLE hChange
);
BOOL
WINAPI
ClosePrinter(
_In_ HANDLE hPrinter
);
这都是啥呢,参见微软: