module enumdev; private import std.stdio; private import std.c.stdlib; private import win32.windows; private import upnp; private import util; int main() { HRESULT hr; //初期化する hr=CoInitialize(null); if (FAILED(hr)) { printf("failed to CoInitialize\n"); printf("hr = %x\n",hr); return EXIT_FAILURE; } //DeviceFinder を取得する IUPnPDeviceFinder deviceFinder; hr = CoCreateInstance( &CLSID_UPnPDeviceFinder, null, cast(uint)CLSCTX_SERVER, &IID_IUPnPDeviceFinder, cast(void**)&deviceFinder); if (FAILED(hr)) { printf("failed to CoCreateInstance\n"); printf("hr = %x\n",hr); return EXIT_FAILURE; } scope(exit) deviceFinder.Release(); //ルートデバイスの集合を取得する IUPnPDevices devices; BSTR type; scope(exit) SysFreeString(type); type = SysAllocString("upnp:rootdevice"w.dup.ptr); if(!type) { printf("filed to SysAllocString\n"); return EXIT_FAILURE; } hr = deviceFinder.FindByType(type, 0,devices); if (FAILED(hr)) { printf("filed to FindByType\n"); printf("hr = %x\n",hr); return EXIT_FAILURE; } scope(exit) devices.Release(); IUnknown unknown; devices._NewEnum(unknown); if (FAILED(hr)) { printf("filed to IUPnPDevices._NewEnum\n"); printf("hr = %x\n",hr); return EXIT_FAILURE; } scope(exit) unknown.Release(); IEnumUnknown enumUnknown; hr = unknown.QueryInterface(cast(GUID*)&IID_IEnumUnknown,cast(void**)&enumUnknown); if (FAILED(hr)) { printf("filed to QueryInterface\n"); printf("hr = %x\n",hr); return EXIT_FAILURE; } scope(exit) enumUnknown.Release(); int deviceCount; hr = devices.Count(deviceCount); if (FAILED(hr)) { printf("filed to IUPnPDevices.Count\n"); printf("hr = %x\n",hr); return EXIT_FAILURE; } for(int i = 0;i