#ifndef EnumPortsEx_H
#define EnumPortsEx_H
//////////////////////////////////////////////////////////////////////////
#include <Windows.h>
#include <Shlwapi.h>
#include <WinSpool.h>
//////////////////////////////////////////////////////////////////////////
#pragma comment(lib, "Shlwapi")
//////////////////////////////////////////////////////////////////////////
template <typename CallbackT>
DWORD EnumPortsEx(CallbackT callback, DWORD dwContext)
{
DWORD dwBufferSize = 0;
DWORD dwReturnSize = 0;
LPBYTE pBuffer = NULL;
PPORT_INFO_1 pPortInfo = NULL;
TCHAR szPortName[128] = { 0 };
SetLastError(ERROR_SUCCESS);
EnumPorts(NULL, 1, NULL, 0, &dwBufferSize, &dwReturnSize);
if (dwBufferSize == 0) {
goto Exit;
}
pBuffer = new BYTE[dwBufferSize];
if (!EnumPorts(NULL, 1, pBuffer, dwBufferSize, &dwBufferSize, &dwReturnSize)) {
goto Exit;
}
pPortInfo = (PPORT_INFO_1) pBuffer;
for (LONG i=0; i<dwReturnSize; ++i) {
LPTSTR pszColon = StrChr(pPortInfo[i].pName, TEXT(':'));
if (pszColon != NULL) {
StrCpyN(szPortName, pPortInfo[i].pName, pszColon - pPortInfo[i].pName + 1);
}
else {
StrCpy(szPortName, pPortInfo[i].pName);
}
callback(szPortName, dwContext);
}
Exit:
delete []pBuffer;
pBuffer = NULL;
pPortInfo = NULL;
return GetLastError();
}
//////////////////////////////////////////////////////////////////////////
#endif

本文介绍了一个用于枚举系统中所有打印端口的API实现方法。通过使用模板回调函数,该API能够遍历所有打印端口并调用指定的回调函数处理每个端口名称。代码基于Windows平台,并利用了Windows API进行开发。

3383

被折叠的 条评论
为什么被折叠?



