{"id":596,"date":"2008-05-15T16:05:18","date_gmt":"2008-05-15T16:05:18","guid":{"rendered":"http:\/\/6teen.ru\/?p=569"},"modified":"2008-05-15T16:05:18","modified_gmt":"2008-05-15T16:05:18","slug":"7144","status":"publish","type":"post","link":"http:\/\/pblog.ru\/lab\/?p=596","title":{"rendered":"\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c &#8212; \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043b\u0438 USB \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e ?"},"content":{"rendered":"<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c &#8212; \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043b\u0438 USB \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e ?<br \/>\n<!--more--><\/p>\n<pre class=\"alt2\" style=\"margin:0px; padding:6px; border:1px inset; width:580px; height:320px; overflow:auto\"><div>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c - \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043b\u0438 USB \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e ?\n\nautor: miguel lucero\nhomepage: www.lsis.com.ar\n\/\/ component to detect when usb devices are connected or disconnected\n\/\/ using registerdevicenotification\n\nunit u_usb;\n\ninterface\n\nuses\nwindows, messages, sysutils, classes, forms;\n\ntype\n\npdevbroadcasthdr = ^dev_broadcast_hdr;\ndev_broadcast_hdr = packed record\ndbch_size: dword;\ndbch_devicetype: dword;\ndbch_reserved: dword;\nend;\n\npdevbroadcastdeviceinterface = ^dev_broadcast_deviceinterface;\ndev_broadcast_deviceinterface = record\ndbcc_size: dword;\ndbcc_devicetype: dword;\ndbcc_reserved: dword;\ndbcc_classguid: tguid;\ndbcc_name: short;\nend;\n\nconst\nguid_devinterface_usb_device: tguid = '{a5dcbf10-6530-11d2-901f-00c04fb951ed}';\ndbt_devicearrival = $8000; \/\/ system detected a new device\ndbt_deviceremovecomplete = $8004; \/\/ device is gone\ndbt_devtyp_deviceinterface = $00000005; \/\/ device interface class\n\ntype\n\ntcomponentusb = class(tcomponent)\nprivate\nfwindowhandle: hwnd;\nfonusbarrival: tnotifyevent;\nfonusbremove: tnotifyevent;\nprocedure wndproc(var msg: tmessage);\nfunction usbregister: boolean;\nprotected\nprocedure wmdevicechange(var msg: tmessage); dynamic;\npublic\nconstructor create(aowner: tcomponent); override;\ndestructor destroy; override;\npublished\nproperty onusbarrival: tnotifyevent read fonusbarrival write fonusbarrival;\nproperty onusbremove: tnotifyevent read fonusbremove write fonusbremove;\nend;\n\nimplementation\n\nconstructor tcomponentusb.create(aowner: tcomponent);\nbegin\ninherited create(aowner);\nfwindowhandle := allocatehwnd(wndproc);\nusbregister;\nend;\n\ndestructor tcomponentusb.destroy;\nbegin\ndeallocatehwnd(fwindowhandle);\ninherited destroy;\nend;\n\nprocedure tcomponentusb.wndproc(var msg: tmessage);\nbegin\nif (msg.msg = wm_devicechange) then\nbegin\ntry\nwmdevicechange(msg);\nexcept\napplication.handleexception(self);\nend;\nend\nelse\nmsg.result := defwindowproc(fwindowhandle, msg.msg, msg.wparam, msg.lparam);\nend;\n\nprocedure tcomponentusb.wmdevicechange(var msg: tmessage);\nvar\ndevtype: integer;\ndatos: pdevbroadcasthdr;\nbegin\nif (msg.wparam = dbt_devicearrival) or (msg.wparam = dbt_deviceremovecomplete) then\nbegin\ndatos := pdevbroadcasthdr(msg.lparam);\ndevtype := datos^.dbch_devicetype;\nif devtype = dbt_devtyp_deviceinterface then\nbegin \/\/ usb device\nif msg.wparam = dbt_devicearrival then\nbegin\nif assigned(fonusbarrival) then\nfonusbarrival(self);\nend\nelse\nbegin\nif assigned(fonusbremove) then\nfonusbremove(self);\nend;\n\nfunction tcomponentusb.usbregister: boolean;\nvar\ndbi: dev_broadcast_deviceinterface;\nsize: integer;\nr: pointer;\nbegin\nresult := false;\nsize := sizeof(dev_broadcast_deviceinterface);\nzeromemory(@dbi, size);\ndbi.dbcc_size := size;\ndbi.dbcc_devicetype := dbt_devtyp_deviceinterface;\ndbi.dbcc_reserved := 0;\ndbi.dbcc_classguid := guid_devinterface_usb_device;\ndbi.dbcc_name := 0;\n\nr := registerdevicenotification(fwindowhandle, @dbi,\ndevice_notify_window_handle\n);\nif assigned(r) then result := true;\nend;\n\nend.\n<\/div><\/pre>\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c &#8212; \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043b\u0438 USB \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e ?<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[433,451],"tags":[594,1509,1566,1820],"_links":{"self":[{"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/posts\/596"}],"collection":[{"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=596"}],"version-history":[{"count":0,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/posts\/596\/revisions"}],"wp:attachment":[{"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=596"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=596"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}