#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