COM实现系统SENS接口获取网络断开事件
来源:互联网 发布:阿里云 外网 iis 404 编辑:程序博客网 时间:2024/05/22 10:39
ISensNetwork Interface
从MSDN拷贝的关于ISensNetwork说明。查看实现源码。
The ISensNetwork interface handles network events fired by the System Event Notification Service (SENS).
When To Implement
Implement this interface on your sink object if you subscribe to any of the SENS network events. Each event corresponds to a method in this interface. This interface is an outgoing interface defined by SENS and implemented by the subscriber application as a dispatch interface.
When To Use
SENS and the COM Event System call the ISensNetwork methods on your sink object to fire the corresponding event.
Starting with applications designed for Windows Vista and Windows Server 2008, developers should consider using the Network List Manager instead of this interface.
Methods
The ISensNetwork interface inherits the methods of the IDispatch interface.
In addition, ISensNetwork defines the following methods.
ConnectionMade
Specified connection has been established.
ConnectionMadeNoQOCInfo
Specified connection has been established with no Quality of Connection information available.
ConnectionLost
Specified connection has been dropped.
Windows中系统提供了System Event Notification Service(SENS),系统事件通告服务。
我们用它可以得到:
- TCP/IP网络事件,例如TCP/IP网络连接状态或连接质量信息。
- 用户登入事件。
- 电池和电源事件。
使用VC向导增加一个ATL类,
在头文件中导入Sens.dll。VC会自动生成头文件,包括Sens接口的定义。
// SensNetEvents.h : Declaration of the CSensNetEvents#pragma once#include "resource.h" // main symbols#include "StockInfo_i.h"#import "C:\WINDOWS\System32\SENS.DLL" raw_interfaces_only, raw_native_types, no_namespace, named_guids #if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)#error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms."#endif// CSensNetEventsclass ATL_NO_VTABLE CSensNetEvents : public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CSensNetEvents, &CLSID_SensNetEvents>, public IDispatchImpl<ISensNetEvents, &IID_ISensNetEvents, &LIBID_StockInfoLib, /*wMajor =*/ 1, /*wMinor =*/ 0>, public IDispatchImpl<ISensOnNow, &IID_ISensOnNow, &LIBID_SensEvents>, public IDispatchImpl<ISensLogon, &IID_ISensLogon, &LIBID_SensEvents>, public IDispatchImpl<ISensLogon2, &IID_ISensLogon2, &LIBID_SensEvents>, public IDispatchImpl<ISensNetwork, &IID_ISensNetwork, &LIBID_SensEvents>{public: CSensNetEvents(); HRESULT FinalConstruct(); void FinalRelease();DECLARE_PROTECT_FINAL_CONSTRUCT()DECLARE_REGISTRY_RESOURCEID(IDR_SENSNETEVENTS)BEGIN_COM_MAP(CSensNetEvents) COM_INTERFACE_ENTRY(ISensOnNow) COM_INTERFACE_ENTRY(ISensLogon) COM_INTERFACE_ENTRY(ISensLogon2) COM_INTERFACE_ENTRY(ISensNetwork) COM_INTERFACE_ENTRY(ISensNetEvents) COM_INTERFACE_ENTRY2(IDispatch, ISensNetEvents)END_COM_MAP()// ISensNetEvents propertypublic: STDMETHOD (get_OwnerWindow)(OLE_HANDLE* pVal); STDMETHOD (put_OwnerWindow)(OLE_HANDLE newVal);// ISensNetEvents methodspublic: STDMETHOD (StartMonitor)(OLE_HANDLE hWnd); STDMETHOD (StopMonitor)(void);public: // ISensNetwork STDMETHOD (ConnectionMade)(BSTR, unsigned long, struct SENS_QOCINFO *); STDMETHOD (ConnectionMadeNoQOCInfo)(BSTR, unsigned long); STDMETHOD (ConnectionLost)(BSTR, unsigned long); STDMETHOD (DestinationReachable)(BSTR,BSTR, unsigned long, struct SENS_QOCINFO *); STDMETHOD (DestinationReachableNoQOCInfo)(BSTR, BSTR, unsigned long);public: // ISensOnNow STDMETHOD (OnACPower)(); STDMETHOD (OnBatteryPower)(unsigned long); STDMETHOD (BatteryLow)(unsigned long); public: // ISensLogon STDMETHOD (Logon)(BSTR); STDMETHOD (Logoff)(BSTR); STDMETHOD (StartShell)(BSTR); STDMETHOD (DisplayLock)(BSTR); STDMETHOD (DisplayUnlock)(BSTR); STDMETHOD (StartScreenSaver)(BSTR); STDMETHOD (StopScreenSaver)(BSTR); public: // ISensLogon2 STDMETHOD (Logon)(BSTR, unsigned long); STDMETHOD (Logoff)(BSTR, unsigned long); STDMETHOD (SessionDisconnect)(BSTR, unsigned long); STDMETHOD (SessionReconnect)(BSTR, unsigned long); STDMETHOD (PostShell)(BSTR, unsigned long);private: HWND m_hOwnerWnd; CComPtr<IEventSystem> m_EventSys;};typedef struct tagSensNetSubscribe{ const GUID Id; LPCSTR Name; LPCSTR Method; const GUID classId;} SENSNET_SUBSCRIBE, *PSENSNET_SUBSCRIBE;extern const __declspec(selectany) SENSNET_SUBSCRIBE SensNet_Subscribe_Array[] ={ // ---------------------------------ISensNetwork --------------------------------- { { 0x7bf4904f, 0xf525, 0x4173, { 0xb6, 0x10, 0x24, 0x6e, 0x1, 0x99, 0x1a, 0x00 } }, "ISensNetwork::ConnectionMade", "ConnectionMade", { 0xd5978620, 0x5b9f, 0x11d1, { 0x8d, 0xd2, 0x00, 0xaa, 0x00, 0x4a, 0xbd, 0x5e} } }, { { 0x7bf4904f, 0xf525, 0x4173, { 0xb6, 0x10, 0x24, 0x6e, 0x1, 0x99, 0x1a, 0x01 } }, "ISensNetwork::ConnectionMadeNoQOCInfo", "ConnectionMadeNoQOCInfo", { 0xd5978620, 0x5b9f, 0x11d1, { 0x8d, 0xd2, 0x00, 0xaa, 0x00, 0x4a, 0xbd, 0x5e} } }, { { 0x7bf4904f, 0xf525, 0x4173, { 0xb6, 0x10, 0x24, 0x6e, 0x1, 0x99, 0x1a, 0x02 } }, "ISensNetwork::ConnectionLost", "ConnectionLost", { 0xd5978620, 0x5b9f, 0x11d1, { 0x8d, 0xd2, 0x00, 0xaa, 0x00, 0x4a, 0xbd, 0x5e} } }, { { 0x7bf4904f, 0xf525, 0x4173, { 0xb6, 0x10, 0x24, 0x6e, 0x1, 0x99, 0x1a, 0x03 } }, "ISensNetwork::DestinationReachable", "DestinationReachable", { 0xd5978620, 0x5b9f, 0x11d1, { 0x8d, 0xd2, 0x00, 0xaa, 0x00, 0x4a, 0xbd, 0x5e} } }, { { 0x7bf4904f, 0xf525, 0x4173, { 0xb6, 0x10, 0x24, 0x6e, 0x1, 0x99, 0x1a, 0x04 } }, "ISensNetwork::DestinationReachableNoQOCInfo", "DestinationReachableNoQOCInfo", { 0xd5978620, 0x5b9f, 0x11d1, { 0x8d, 0xd2, 0x00, 0xaa, 0x00, 0x4a, 0xbd, 0x5e} } }, // -----------------------------------ISensOnNow ----------------------------------- { { 0x7bf4904f, 0xf525, 0x4173, { 0xb6, 0x10, 0x24, 0x6e, 0x1, 0x99, 0x1a, 0x05 } }, "ISensOnNow::OnACPower", "OnACPower", { 0xd5978640, 0x5b9f, 0x11d1, { 0x8d, 0xd2, 0x00, 0xaa, 0x00, 0x4a, 0xbd, 0x5e} } }, { { 0x7bf4904f, 0xf525, 0x4173, { 0xb6, 0x10, 0x24, 0x6e, 0x1, 0x99, 0x1a, 0x06 } }, "ISensOnNow::OnBatteryPower", "OnBatteryPower", { 0xd5978640, 0x5b9f, 0x11d1, { 0x8d, 0xd2, 0x00, 0xaa, 0x00, 0x4a, 0xbd, 0x5e} } }, { { 0x7bf4904f, 0xf525, 0x4173, { 0xb6, 0x10, 0x24, 0x6e, 0x1, 0x99, 0x1a, 0x07 } }, "ISensOnNow::BatteryLow", "BatteryLow", { 0xd5978640, 0x5b9f, 0x11d1, { 0x8d, 0xd2, 0x00, 0xaa, 0x00, 0x4a, 0xbd, 0x5e} } }, // -----------------------------------ISensLogon----------------------------------- { { 0x7bf4904f, 0xf525, 0x4173, { 0xb6, 0x10, 0x24, 0x6e, 0x1, 0x99, 0x1a, 0x08 } }, "ISensLogon::Logon", "Logon", { 0xd5978630, 0x5b9f, 0x11d1, { 0x8d, 0xd2, 0x00, 0xaa, 0x00, 0x4a, 0xbd, 0x5e} } }, { { 0x7bf4904f, 0xf525, 0x4173, { 0xb6, 0x10, 0x24, 0x6e, 0x1, 0x99, 0x1a, 0x09 } }, "ISensLogon::Logoff", "Logoff", { 0xd5978630, 0x5b9f, 0x11d1, { 0x8d, 0xd2, 0x00, 0xaa, 0x00, 0x4a, 0xbd, 0x5e} } }, { { 0x7bf4904f, 0xf525, 0x4173, { 0xb6, 0x10, 0x24, 0x6e, 0x1, 0x99, 0x1a, 0x0a } }, "ISensLogon::StartShell", "StartShell", { 0xd5978630, 0x5b9f, 0x11d1, { 0x8d, 0xd2, 0x00, 0xaa, 0x00, 0x4a, 0xbd, 0x5e} } }, { { 0x7bf4904f, 0xf525, 0x4173, { 0xb6, 0x10, 0x24, 0x6e, 0x1, 0x99, 0x1a, 0x0b } }, "ISensLogon::DisplayLock", "DisplayLock", { 0xd5978630, 0x5b9f, 0x11d1, { 0x8d, 0xd2, 0x00, 0xaa, 0x00, 0x4a, 0xbd, 0x5e} } }, { { 0x7bf4904f, 0xf525, 0x4173, { 0xb6, 0x10, 0x24, 0x6e, 0x1, 0x99, 0x1a, 0x0c } }, "ISensLogon::DisplayUnlock", "DisplayUnlock", { 0xd5978630, 0x5b9f, 0x11d1, { 0x8d, 0xd2, 0x00, 0xaa, 0x00, 0x4a, 0xbd, 0x5e} } }, { { 0x7bf4904f, 0xf525, 0x4173, { 0xb6, 0x10, 0x24, 0x6e, 0x1, 0x99, 0x1a, 0x0d } }, "ISensLogon::StartScreenSaver", "StartScreenSaver", { 0xd5978630, 0x5b9f, 0x11d1, { 0x8d, 0xd2, 0x00, 0xaa, 0x00, 0x4a, 0xbd, 0x5e} } }, { { 0x7bf4904f, 0xf525, 0x4173, { 0xb6, 0x10, 0x24, 0x6e, 0x1, 0x99, 0x1a, 0x0e } }, "ISensLogon::StopScreenSaver", "StopScreenSaver", { 0xd5978630, 0x5b9f, 0x11d1, { 0x8d, 0xd2, 0x00, 0xaa, 0x00, 0x4a, 0xbd, 0x5e} } }, // -----------------------------------ISensLogon2----------------------------------- { { 0x7bf4904f, 0xf525, 0x4173, { 0xb6, 0x10, 0x24, 0x6e, 0x1, 0x99, 0x1a, 0x0f } }, "ISensLogon2::Logon", "Logon", { 0xd5978650, 0x5b9f, 0x11d1, { 0x8d, 0xd2, 0x00, 0xaa, 0x00, 0x4a, 0xbd, 0x5e} } }, { { 0x7bf4904f, 0xf525, 0x4173, { 0xb6, 0x10, 0x24, 0x6e, 0x1, 0x99, 0x1a, 0x10 } }, "ISensLogon2::Logoff", "Logoff", { 0xd5978650, 0x5b9f, 0x11d1, { 0x8d, 0xd2, 0x00, 0xaa, 0x00, 0x4a, 0xbd, 0x5e} } }, { { 0x7bf4904f, 0xf525, 0x4173, { 0xb6, 0x10, 0x24, 0x6e, 0x1, 0x99, 0x1a, 0x11 } }, "ISensLogon2::SessionDisconnect", "SessionDisconnect", { 0xd5978650, 0x5b9f, 0x11d1, { 0x8d, 0xd2, 0x00, 0xaa, 0x00, 0x4a, 0xbd, 0x5e} } }, { { 0x7bf4904f, 0xf525, 0x4173, { 0xb6, 0x10, 0x24, 0x6e, 0x1, 0x99, 0x1a, 0x12 } }, "ISensLogon2::SessionReconnect", "SessionReconnect", { 0xd5978650, 0x5b9f, 0x11d1, { 0x8d, 0xd2, 0x00, 0xaa, 0x00, 0x4a, 0xbd, 0x5e} } }, { { 0x7bf4904f, 0xf525, 0x4173, { 0xb6, 0x10, 0x24, 0x6e, 0x1, 0x99, 0x1a, 0x13 } }, "ISensLogon2::PostShell", "PostShell", { 0xd5978650, 0x5b9f, 0x11d1, { 0x8d, 0xd2, 0x00, 0xaa, 0x00, 0x4a, 0xbd, 0x5e} } },};#define SUBSCRIBE_COUNT (sizeof(SensNet_Subscribe_Array) / sizeof(SENSNET_SUBSCRIBE))OBJECT_ENTRY_AUTO(__uuidof(SensNetEvents), CSensNetEvents)
源文件:
#include "stdafx.h"#include "SensNetEvents.h"//IEventSystem* pEventSys = NULL;CSensNetEvents::CSensNetEvents(): m_hOwnerWnd(NULL), m_EventSys(NULL){ ATLTRACE("CSensNetEvents::CSensNetEvents");}HRESULT CSensNetEvents::FinalConstruct(){ ATLTRACE("CSensNetEvents::FinalConstruct"); StopMonitor(); return S_OK;}void CSensNetEvents::FinalRelease(){ ATLTRACE("CSensNetEvents::FinalRelease");}STDMETHODIMP CSensNetEvents::ConnectionMade( BSTR bstrConnection, ULONG ulType, SENS_QOCINFO * lpQOCInfo){ ATLTRACE("CSensNetEvents::ConnectionMade"); return E_NOTIMPL;}STDMETHODIMP CSensNetEvents::ConnectionMadeNoQOCInfo( BSTR bstrConnection, ULONG ulType){ ATLTRACE("CSensNetEvents::ConnectionMadeNoQOCInfo"); return E_NOTIMPL;}STDMETHODIMP CSensNetEvents::ConnectionLost( BSTR bstrConnection, ULONG ulType){ ATLTRACE("CSensNetEvents::ConnectionLost"); return E_NOTIMPL;}STDMETHODIMP CSensNetEvents::DestinationReachable( BSTR bstrDestination, BSTR bstrConnection, ULONG ulType, SENS_QOCINFO * lpQOCInfo){ ATLTRACE("CSensNetEvents::DestinationReachable"); return E_NOTIMPL;}STDMETHODIMP CSensNetEvents::DestinationReachableNoQOCInfo( BSTR bstrDestination, BSTR bstrConnection, ULONG ulType){ ATLTRACE("CSensNetEvents::DestinationReachableNoQOCInfo"); return E_NOTIMPL;}STDMETHODIMP CSensNetEvents::Logon( BSTR bstrUserName){ ATLTRACE("CSensNetEvents::Logon"); return E_NOTIMPL;}STDMETHODIMP CSensNetEvents::Logoff( BSTR bstrUserName){ ATLTRACE("CSensNetEvents::Logoff"); return E_NOTIMPL;}STDMETHODIMP CSensNetEvents::StartShell( BSTR bstrUserName){ ATLTRACE("CSensNetEvents::StartShell"); return E_NOTIMPL;}STDMETHODIMP CSensNetEvents::DisplayLock( BSTR bstrUserName){ ATLTRACE("CSensNetEvents::DisplayLock"); return E_NOTIMPL;}STDMETHODIMP CSensNetEvents::DisplayUnlock( BSTR bstrUserName){ ATLTRACE("CSensNetEvents::DisplayUnlock"); return E_NOTIMPL;}STDMETHODIMP CSensNetEvents::StartScreenSaver( BSTR bstrUserName){ ATLTRACE("CSensNetEvents::StartScreenSaver"); return E_NOTIMPL;}STDMETHODIMP CSensNetEvents::StopScreenSaver( BSTR bstrUserName){ ATLTRACE("CSensNetEvents::StopScreenSaver"); return E_NOTIMPL;}STDMETHODIMP CSensNetEvents::OnACPower(){ ATLTRACE("CSensNetEvents::OnACPower"); return E_NOTIMPL;}STDMETHODIMP CSensNetEvents::OnBatteryPower( unsigned long dwBatteryLifePercent){ ATLTRACE("CSensNetEvents::OnBatteryPower"); return E_NOTIMPL;}STDMETHODIMP CSensNetEvents::BatteryLow( unsigned long dwBatteryLifePercent){ ATLTRACE("CSensNetEvents::BatteryLow"); return E_NOTIMPL;}STDMETHODIMP CSensNetEvents::Logon( BSTR bstrUserName, unsigned long dwSessionId){ ATLTRACE("CSensNetEvents::Logon"); return E_NOTIMPL;}STDMETHODIMP CSensNetEvents::Logoff( BSTR bstrUserName, unsigned long dwSessionId){ ATLTRACE("CSensNetEvents::Logoff"); return E_NOTIMPL;}STDMETHODIMP CSensNetEvents::SessionDisconnect( BSTR bstrUserName, unsigned long dwSessionId){ ATLTRACE("CSensNetEvents::SessionDisconnect"); return E_NOTIMPL;}STDMETHODIMP CSensNetEvents::SessionReconnect( BSTR bstrUserName, unsigned long dwSessionId){ ATLTRACE("CSensNetEvents::SessionReconnect"); return E_NOTIMPL;}STDMETHODIMP CSensNetEvents::PostShell( BSTR bstrUserName, unsigned long dwSessionId){ ATLTRACE("CSensNetEvents::PostShell"); return E_NOTIMPL;}STDMETHODIMP CSensNetEvents::get_OwnerWindow(OLE_HANDLE* pVal){ AFX_MANAGE_STATE(AfxGetStaticModuleState()); // TODO: Add your implementation code here *pVal = (OLE_HANDLE)m_hOwnerWnd; return S_OK;}STDMETHODIMP CSensNetEvents::put_OwnerWindow(OLE_HANDLE newVal){ AFX_MANAGE_STATE(AfxGetStaticModuleState()); // TODO: Add your implementation code here m_hOwnerWnd = (HWND)newVal; return S_OK;}STDMETHODIMP CSensNetEvents::StartMonitor(OLE_HANDLE hWnd){ AFX_MANAGE_STATE(AfxGetStaticModuleState()); ATLTRACE("CSensNetEvents::StartMonitor -- Begin"); DWORD dwFlags = 0; ::IsNetworkAlive((LPDWORD)&dwFlags); m_hOwnerWnd = (HWND)hWnd; if ( !m_EventSys ) { if ( FAILED(m_EventSys.CoCreateInstance(CLSID_CEventSystem, NULL, CLSCTX_SERVER)) ) { ATLTRACE("FAILED: CSensNetEvents::StartMonitor m_EventSys->CoCreateInstance"); return E_FAIL; } ATLTRACE("SUCCEED: CSensNetEvents::StartMonitor m_EventSys->CoCreateInstance"); } int failed = 0; for (int i = 0; i < SUBSCRIBE_COUNT; i++, failed++ ) { CComPtr<IEventSubscription> pSubscription; if ( FAILED(pSubscription.CoCreateInstance(CLSID_CEventSubscription)) ) { ATLTRACE("FAILED: CSensNetEvents::StartMonitor pSubscription->CoCreateInstance"); continue; } pSubscription->put_SubscriptionID(CComBSTR(SensNet_Subscribe_Array[i].Id)); pSubscription->put_EventClassID(CComBSTR(SensNet_Subscribe_Array[i].classId)); pSubscription->put_SubscriptionName(CComBSTR(SensNet_Subscribe_Array[i].Name)); pSubscription->put_MethodName(CComBSTR(SensNet_Subscribe_Array[i].Method)); pSubscription->put_SubscriberInterface((ISensNetEvents*)this); pSubscription->put_Enabled(TRUE); if ( FAILED(m_EventSys->Store(CComBSTR(PROGID_EventSubscription), pSubscription)) ) { ATLTRACE("FAILED: CSensNetEvents::StartMonitor EventSys->Store"); } else { ATLTRACE("SUCCEED: CSensNetEvents::StartMonitor EventSys->Store"); failed--; } } ATLTRACE("CSensNetEvents::StartMonitor -- Completed"); return failed > 0 ? E_FAIL : S_OK;}STDMETHODIMP CSensNetEvents::StopMonitor(void){ AFX_MANAGE_STATE(AfxGetStaticModuleState()); ATLTRACE("CSensNetEvents::StopMonitor -- Begin"); if ( !m_EventSys ) { //if ( FAILED(m_EventSys.CoCreateInstance(CLSID_CEventSystem, NULL, CLSCTX_SERVER)) ) //{ ATLTRACE("FAILED: CSensNetEvents::StopMonitor m_EventSys->CoCreateInstance"); return E_FAIL; //} //ATLTRACE("SUCCEED: CSensNetEvents::StopMonitor m_EventSys->CoCreateInstance"); } int failed = 0; for (int i = 0; i < SUBSCRIBE_COUNT; i++) { CComBSTR bsQuery(TEXT("SubscriptionID=")); int err; bsQuery += CComBSTR(SensNet_Subscribe_Array[i].Id); if ( FAILED(m_EventSys->Remove(PROGID_EventSubscription, bsQuery, &err)) ) { ATLTRACE("FAILED: CSensNetEvents::StopMonitor m_EventSys->Remove"); failed++; } else { ATLTRACE("SUCCEED: CSensNetEvents::StopMonitor m_EventSys->Remove"); } } ATLTRACE("CSensNetEvents::StopMonitor -- Completed"); return failed > 0 ? E_FAIL : S_OK;}
COM注册表注册文件:
HKCR{StockInfo.SensNetEvents.1 = s 'SensNetEvents Class'{CLSID = s '{0DCC8034-7433-456F-9200-0BF9F3EFBD1F}'}StockInfo.SensNetEvents = s 'SensNetEvents Class'{CLSID = s '{0DCC8034-7433-456F-9200-0BF9F3EFBD1F}'CurVer = s 'StockInfo.SensNetEvents.1'}NoRemove CLSID{ForceRemove {0DCC8034-7433-456F-9200-0BF9F3EFBD1F} = s 'SensNetEvents Class'{ProgID = s 'StockInfo.SensNetEvents.1'VersionIndependentProgID = s 'StockInfo.SensNetEvents'ForceRemove 'Programmable'InprocServer32 = s '%MODULE%'{val ThreadingModel = s 'Apartment'}'TypeLib' = s '{7204EEE7-A379-4A28-93D4-F33151DDECD8}'}}}
- COM实现系统SENS接口获取网络断开事件
- SENS:系统事件通知服务 和 WMI 支持灵活而有效的移动网络计算
- 简单实现SNMP获取系统信息以及网络接口信息
- 客户端调用COM, 实现接口调用和COM事件通知
- 如何监听网络断开的事件
- android 获取蓝牙连接断开连接事件
- Dispatch接口事件的纯手工实现(C++ COM)
- 【win7系统休眠后网络断开怎么办?】
- 使用SENS API获取当前网卡连接速度
- iOS 网络断开的提示实现
- Linux系统 C++ 获取网络接口,以及主机网关IP
- 断开网络
- COM接口中的信息获取
- 获取Android各类系统相关信息的接口实现代码
- 实现接口事件
- UGUI实现接口事件
- mfc工程中添加com事件接口
- MFC如何实现com接口
- 观察者
- SIGTRAN协议
- 怎样让InfoPath表单的连接 强制在浏览器中打开
- VC封装USB接口的智能卡读写(应用层)
- WIN XP蓝屏代码大全
- COM实现系统SENS接口获取网络断开事件
- windows开机密码问题
- Udp实现通信DEMO
- 分页(struts2+hibernate+标签)
- @Resource 注入资源方式示例
- 睿频和超频
- 彻底剖析C# 2.0泛型类的创建和使用
- 一道还算有技术含量的SQL面试题
- 设置mysql允许外网访问