| 2312 |
HMODULE h; |
HMODULE h; |
| 2313 |
TCHAR devicesBuff[65535]; |
TCHAR devicesBuff[65535]; |
| 2314 |
char com_str[64]; |
char com_str[64]; |
| 2315 |
|
BOOL bRet; |
| 2316 |
|
GUID ClassGuid[1]; |
| 2317 |
|
DWORD dwRequiredSize; |
| 2318 |
|
HDEVINFO DeviceInfoSet = NULL; |
| 2319 |
|
SP_DEVINFO_DATA DeviceInfoData; |
| 2320 |
|
int found = 0; |
| 2321 |
|
|
| 2322 |
_snprintf_s(com_str, sizeof(com_str), _TRUNCATE, "COM%d", ComPort); |
_snprintf_s(com_str, sizeof(com_str), _TRUNCATE, "COM%d", ComPort); |
| 2323 |
|
|
| 2325 |
/* ERROR */ |
/* ERROR */ |
| 2326 |
return -1; |
return -1; |
| 2327 |
} |
} |
| 2328 |
if (QueryDosDevice(com_str, devicesBuff, 65535) != 0) { |
|
| 2329 |
return 1; |
if (QueryDosDevice(com_str, devicesBuff, 65535) == 0) { |
|
} |
|
|
else { |
|
| 2330 |
DWORD err = GetLastError(); |
DWORD err = GetLastError(); |
| 2331 |
if (err == ERROR_FILE_NOT_FOUND) { |
if (err == ERROR_FILE_NOT_FOUND) { |
| 2332 |
/* NOT FOUND */ |
/* NOT FOUND */ |
| 2335 |
/* ERROR */ |
/* ERROR */ |
| 2336 |
return -1; |
return -1; |
| 2337 |
} |
} |
| 2338 |
|
|
| 2339 |
|
/* QueryDosDeviceで切断を検知できない環境があるでさらにチェック */ |
| 2340 |
|
bRet = SetupDiClassGuidsFromName(_T("PORTS"), (LPGUID) & ClassGuid, 1, &dwRequiredSize); |
| 2341 |
|
if (bRet == FALSE) { |
| 2342 |
|
return -1; |
| 2343 |
|
} |
| 2344 |
|
|
| 2345 |
|
DeviceInfoSet = SetupDiGetClassDevs(&ClassGuid[0], NULL, NULL, DIGCF_PRESENT | DIGCF_PROFILE); |
| 2346 |
|
if (DeviceInfoSet == NULL) { |
| 2347 |
|
return -1; |
| 2348 |
|
} |
| 2349 |
|
|
| 2350 |
|
if (DeviceInfoSet) { |
| 2351 |
|
DWORD dwMemberIndex = 0; |
| 2352 |
|
HKEY hKey = NULL; |
| 2353 |
|
TCHAR szPortName[MAX_PATH]; |
| 2354 |
|
DWORD dwReqSize; |
| 2355 |
|
DWORD dwType; |
| 2356 |
|
|
| 2357 |
|
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); |
| 2358 |
|
while (SetupDiEnumDeviceInfo(DeviceInfoSet, dwMemberIndex, &DeviceInfoData)) { |
| 2359 |
|
hKey = SetupDiOpenDevRegKey(DeviceInfoSet, &DeviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ); |
| 2360 |
|
if (hKey) { |
| 2361 |
|
long lRet; |
| 2362 |
|
dwReqSize = sizeof(szPortName); |
| 2363 |
|
lRet = RegQueryValueEx(hKey, _T("PortName"), 0, &dwType, (LPBYTE)& szPortName, &dwReqSize); |
| 2364 |
|
RegCloseKey(hKey); |
| 2365 |
|
if (_stricmp(szPortName, com_str) == 0) { |
| 2366 |
|
found = TRUE; |
| 2367 |
|
break; |
| 2368 |
|
} |
| 2369 |
|
} |
| 2370 |
|
dwMemberIndex++; |
| 2371 |
|
} |
| 2372 |
|
} |
| 2373 |
|
|
| 2374 |
|
SetupDiDestroyDeviceInfoList(DeviceInfoSet); |
| 2375 |
|
|
| 2376 |
|
return found; |
| 2377 |
} |
} |
| 2378 |
|
|
| 2379 |
BOOL WINAPI DllMain(HANDLE hInstance, |
BOOL WINAPI DllMain(HANDLE hInstance, |