|
|
楼主 |
发表于 2011-7-15 17:28:52
|
显示全部楼层
以下有关upnp的接口来自emule,. v$ T7 S) |* H& V( P# M
- `& L1 _! o* q6 O9 j
6 N) c, a3 c7 Z% G0 B$ h& O% n
///////////////////////////////////////////( }% D/ z: t0 O+ [" P9 a: P
//upnp的抽象接口类,只需调用这些接口即可实现端口映射功能.
2 P( k$ u& f" q' |$ ?7 n' Y
& s0 u4 j2 j l8 g9 [$ {- e5 l
% W% T; [% U% }5 H- ?$ n) w#pragma once' J1 ]0 A8 u" n7 c% o5 @
#include <exception>
2 t7 |: V# L. z6 ]& L1 Q( f z) q: o! C/ O0 K6 I2 T$ z0 T5 I
/ G J3 F2 J, U/ H8 S: S9 j
enum TRISTATE{
8 l( \$ d: a* b$ m/ ]- @( n2 q TRIS_FALSE,
# _ R, J+ z& b0 {; J1 K8 A* z1 a TRIS_UNKNOWN,
( y1 c( y) C& R# @9 n TRIS_TRUE- ?6 C% R' s( G
};: y- G$ o9 }2 {# f
3 ]! M5 x* d5 A: ?) e: @
^% Z$ O( l! m6 v8 ^( Ienum UPNP_IMPLEMENTATION{
8 k5 C- l& G2 `4 s! ^) N$ m UPNP_IMPL_WINDOWSERVICE = 0,+ S: T6 X9 H! U% Q" Q" E! I
UPNP_IMPL_MINIUPNPLIB,
. C1 o" t5 L$ G2 h5 u' u! i UPNP_IMPL_NONE /*last*/
+ D4 o6 N% j$ ?/ G+ H( o};
6 ]! n' @: j+ \" Y
0 Q1 ?) F* _2 y1 x
& O' @' K' A" V! B1 U" i. G9 j* z' i& e: E7 f
6 c8 \1 C+ T3 d; F: `class CUPnPImpl# i5 m& B; x* Z
{0 Z+ R9 U; H4 \4 B" `* _$ Y1 F# r0 e% S
public:
6 y. J+ y% x2 U! r: P CUPnPImpl();) @+ V. Y! L; z' D+ E5 G5 F& p
virtual ~CUPnPImpl();6 c( H1 J5 V% b1 {! I5 D; P
struct UPnPError : std::exception {};
+ Y- {, x+ G, R7 G" W enum {; M% T' c: W( ]+ y$ Y( I7 t# B8 g+ Z
UPNP_OK,
" k2 U, U, o9 u( y# H UPNP_FAILED,; c5 @" |6 j! _" y! ~. l" ?; X
UPNP_TIMEOUT
% Y5 S* v' y4 U% i# p+ K };
+ {7 N6 w/ ^3 n+ o
4 S( p4 q, C, E( R+ A% a
5 X' v$ x& D& F virtual void StartDiscovery(uint16 nTCPPort, uint16 nUDPPort, uint16 nTCPWebPort) = 0;
- W8 W/ U7 I$ A virtual bool CheckAndRefresh() = 0;; Z+ J% D+ Q( ]7 t/ e2 L9 D f @0 d
virtual void StopAsyncFind() = 0;
5 q8 S+ g! f4 V9 K% M virtual void DeletePorts() = 0;
9 G5 h) j# X1 B! _1 B- G: R" n virtual bool IsReady() = 0;! w- j8 Q6 S/ m0 J
virtual int GetImplementationID() = 0;1 m% ]* U$ h/ W: @- v* R
9 X( @# x; t9 r. b' _ void LateEnableWebServerPort(uint16 nPort); // Add Webserverport on already installed portmapping' i! p" f* o& A% Y* |) A
9 q* V$ d1 d1 U; c1 X: H
0 [3 Y5 S! Z" y& h+ \/ ^- p void SetMessageOnResult(HWND hWindow, UINT nMessageID);
; P3 Z7 I" Y0 j O# d/ y+ | D/ x TRISTATE ArePortsForwarded() const { return m_bUPnPPortsForwarded; }# i# N( F$ u7 r* ~) w- z
uint16 GetUsedTCPPort() { return m_nTCPPort; }
8 k3 `' j0 I) l6 v" f uint16 GetUsedUDPPort() { return m_nUDPPort; }
3 n/ { Z4 {% z8 K: ^: Q
; ]5 Q# ?! q; V* U& _" h- x6 z8 I! j8 [2 ~; @- z4 j) H
// Implementation
7 r& c" r! @* v% w6 }& Iprotected:9 j% T4 L8 f2 h4 i O
volatile TRISTATE m_bUPnPPortsForwarded;
0 P2 g' V/ t- ^+ h void SendResultMessage();
: F8 W8 f7 Z# A7 ?- B9 O uint16 m_nUDPPort;7 z" T) z: F3 |. g( J
uint16 m_nTCPPort;
! V" g! j3 f9 V- u, h& c) N3 D, \ uint16 m_nTCPWebPort;8 @: d* c" ]' k5 }# b
bool m_bCheckAndRefresh;
+ ]/ _& q' V z. z+ E- h e5 T0 t6 @3 ~/ \7 m! n
$ s' J7 o1 y' K* m5 F6 U5 A jprivate:+ x- r( d5 a, _# Q6 Y" l
HWND m_hResultMessageWindow;1 K p/ p# Y) o4 n0 }/ f+ p" ?* k6 D
UINT m_nResultMessageID;
- \# Q7 k1 n6 u4 Q3 R* F7 c/ j ~$ h5 ^1 N3 O. O% Q
# K0 B& |- ~. E7 | |};
1 i8 t. G' U3 R; {! V) i( q
# e9 B0 t3 s# ]* _% B$ O8 S+ [9 a# I: y+ y. p# [) x, O: X$ M
// Dummy Implementation to be used when no other implementation is available7 O2 @0 E3 ^1 F* Z
class CUPnPImplNone: public CUPnPImpl
7 n7 z1 A) B% t$ ?+ r* b{
% |* d( f" n( C" e' H* D& b: zpublic:
. Q- p8 n. r5 f% M+ j t virtual void StartDiscovery(uint16, uint16, uint16) { ASSERT( false ); }3 v/ y6 t$ |' n; t$ h
virtual bool CheckAndRefresh() { return false; }
1 z' N+ B1 d, C/ Z ^$ L% E6 Z virtual void StopAsyncFind() { }
/ `3 |: T8 l, W2 l0 `- c virtual void DeletePorts() { }0 Y, [6 E1 ?' n: X; H- W* C
virtual bool IsReady() { return false; }. E3 y3 T H) O6 O+ u& P
virtual int GetImplementationID() { return UPNP_IMPL_NONE; }
1 [, C1 u5 g( M/ c/ k+ T};
, W: h. H& F0 V f0 N6 ?$ t
. k+ X7 r9 v( [! d6 |& i* \3 ?' F5 Z2 |) H
/////////////////////////////////////* f' j- t8 \6 x- Q
//下面是使用windows操作系统自带的UPNP功能的子类
1 D& z. x# t0 s! P6 T, Y
4 p q8 E# H, b' S8 x7 Z
3 H W) u. x+ N9 Z$ e5 c& n#pragma once7 Y: C+ K5 ~8 ^1 y+ ~
#pragma warning( disable: 4355 )+ _% O2 P; H) r
) a* i3 A) V7 Q% i& h$ D
+ m- ]9 [5 u0 u/ a#include "UPnPImpl.h"6 I& P0 t. U2 e- r8 Z# G2 s; C
#include <upnp.h>
! |: p% W+ r# D7 s, r/ p#include <iphlpapi.h>
/ A; N# n" Y0 Z#include <comdef.h># c, Z2 ^0 |. x# G- r k9 F% S
#include <winsvc.h>3 @ i4 m; \9 r2 b
: c- Q$ \; y% a
: @4 H- Q5 B+ E2 A. q#include <vector>
( ^, T/ I' _6 @$ C#include <exception>
( n0 E% o d5 N% O. S* `# L$ i5 l#include <functional>
* {! L1 k8 N/ k5 t
e% a/ h4 V2 s: i( S: _9 h9 d2 G8 V) }
2 b/ o4 p% \) u% j% f# T- z: C
3 R. b2 U" v" L; k- m1 m7 f7 l& ]# s
typedef _com_ptr_t<_com_IIID<IUPnPDeviceFinder,&IID_IUPnPDeviceFinder> > FinderPointer;+ L3 A2 Z1 @( {
typedef _com_ptr_t<_com_IIID<IUPnPDevice,&IID_IUPnPDevice> > DevicePointer;
; z! B$ ^3 j$ i: Y) Ftypedef _com_ptr_t<_com_IIID<IUPnPService,&IID_IUPnPService> > ServicePointer;# j- q" I/ O5 e$ S9 _
typedef _com_ptr_t<_com_IIID<IUPnPDeviceFinderCallback,&IID_IUPnPDeviceFinderCallback> > DeviceFinderCallback;4 p# r, e. c5 J/ H Y8 V, T
typedef _com_ptr_t<_com_IIID<IUPnPServiceCallback,&IID_IUPnPServiceCallback> > ServiceCallback;
) \, r# W- e* Ztypedef _com_ptr_t<_com_IIID<IEnumUnknown,&IID_IEnumUnknown> > EnumUnknownPtr;) t$ q8 j- L1 v5 m
typedef _com_ptr_t<_com_IIID<IUnknown,&IID_IUnknown> > UnknownPtr;
4 f+ C8 C9 N; C% G$ D3 W6 N# k8 X2 q3 H7 T0 G% j8 A, l
# c4 H8 J% O2 A, Itypedef DWORD (WINAPI* TGetBestInterface) (
( E- `+ E( W% R8 x0 A4 L+ a IPAddr dwDestAddr,$ m# X# }: u; N, m3 H2 x
PDWORD pdwBestIfIndex9 r9 M) D8 N" J( G0 Q0 i9 q h4 d9 d
);# M' n0 g$ ^/ I( S- {9 ]0 ^* C1 }3 S
8 ~3 {9 W6 P1 J
2 Y; C. w2 o/ O+ \- B8 rtypedef DWORD (WINAPI* TGetIpAddrTable) (
. e a$ h j9 ]% q8 X7 o6 ` PMIB_IPADDRTABLE pIpAddrTable,
) i0 f2 ~$ @! f+ _: C PULONG pdwSize,
, X' d- ]7 s( K) L# N) T BOOL bOrder2 D/ [3 U6 E& F: H
);: m M2 ?; p$ w7 O2 Y
, v( f8 l7 G; Y" `* ~
, C4 s X' T3 Z+ q5 s
typedef DWORD (WINAPI* TGetIfEntry) ( ?9 ], E1 c9 `3 r( c1 R# |! B
PMIB_IFROW pIfRow9 `5 k; n. I$ {! _3 A# x% H
);
& z+ Q S& s* i# z8 L4 v2 a( @
: o- K- N" M: a( W' V- ?8 e- l+ R, c9 c( z8 q y% w. L
CString translateUPnPResult(HRESULT hr);
) O9 v7 m: U/ D* }$ S o* ~! y9 cHRESULT UPnPMessage(HRESULT hr);
. f5 m# y5 r$ D3 C; j: H
8 ?2 f+ H( _7 _5 s: x7 [: _1 q9 x: G/ _4 b5 G F# y. G! ^7 Q
class CUPnPImplWinServ: public CUPnPImpl+ E+ t9 z0 w5 I
{; c8 v2 h+ n, o
friend class CDeviceFinderCallback;
A( A4 f% Y. [1 F+ s friend class CServiceCallback;
$ t# z% [! n7 L9 l1 T/ W' f# |$ Y// Construction+ K2 m$ g$ m' y J. `
public:. h+ Z/ u4 f7 A0 u9 a
virtual ~CUPnPImplWinServ();
) {5 a/ z' s% z( Z# U3 r CUPnPImplWinServ();: s0 Y: d+ m" ?2 o8 C" Q% t5 U
! B7 x8 P% Q2 r2 P$ q1 G/ x2 J1 e: T) D
virtual void StartDiscovery(uint16 nTCPPort, uint16 nUDPPort, uint16 nTCPWebPort) { StartDiscovery(nTCPPort, nUDPPort, nTCPWebPort, false); }3 E* O2 V! m. a x9 s
virtual void StopAsyncFind();
( f+ ]- `% x' W0 u; R virtual void DeletePorts();/ D' ^, {4 x) k# A
virtual bool IsReady();
6 o6 N# f, Z" j4 ^$ ^9 d* P: ^5 V4 i virtual int GetImplementationID() { return UPNP_IMPL_WINDOWSERVICE; }% I9 D* O6 A5 e
- b5 \) ~7 |: k2 Y$ A% y T6 k" v
// No Support for Refreshing on this (fallback) implementation yet - in many cases where it would be needed (router reset etc)4 l6 \5 P' K1 |5 L# R5 c) ?
// the windows side of the implementation tends to get bugged untill reboot anyway. Still might get added later' s3 u, l6 k5 `. l$ b! S
virtual bool CheckAndRefresh() { return false; };
# T9 y/ c! [7 N4 c% q$ b1 s3 c! n; _& |! W& F Z: J) y
4 i V( w( E9 S! G0 m/ U0 [% V
protected:
9 g: x0 d5 m; w* o void StartDiscovery(uint16 nTCPPort, uint16 nUDPPort, uint16 nTCPWebPort, bool bSecondTry);
( n2 O6 a5 U. l4 y7 h5 [. D: a @ void AddDevice(DevicePointer pDevice, bool bAddChilds, int nLevel = 0);
8 p% Q" [7 k/ H7 Z5 k) U void RemoveDevice(CComBSTR bsUDN);' |# W6 e# m$ R: z4 h3 J) o
bool OnSearchComplete();
7 u/ @0 I" g3 D$ A1 D void Init();
! a0 |! h+ ?5 i8 @5 K, m
( o7 y$ r, W& v' M
$ X$ z1 Z9 S! C0 o3 Q; _ inline bool IsAsyncFindRunning() ) j4 O R3 T0 v0 t
{. e& `1 d6 R* V, g
if ( m_pDeviceFinder != NULL && m_bAsyncFindRunning && GetTickCount() - m_tLastEvent > 10000 )
& l+ |' j7 c0 I3 f) V/ ?) z {7 E2 s' Z4 {% S6 y
m_pDeviceFinder->CancelAsyncFind( m_nAsyncFindHandle );+ W) }' J& e- z2 ~
m_bAsyncFindRunning = false;
2 \( }4 t, C8 W }, E G: k. `: X' I; S) j& ~
MSG msg;
! ^( c, c1 \. F9 c while ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
# m0 [! z8 {6 H' A& }' a& _ {
/ F1 T D; ]' O% f! a0 Z7 } g" e( r TranslateMessage( &msg );
; }- n/ n' P( }8 i4 A3 S. Q- q DispatchMessage( &msg );. F0 p. n6 N% D$ [
}$ I* z! ^# `0 [, J+ K" Q9 ?7 Q
return m_bAsyncFindRunning;6 v8 q& v3 B3 {6 E% D( j# E P
}
) \; o( |% i% s- k' V @. @, J6 T2 x* L. } ]! l4 w# F. _
& y/ j# @. b |3 s5 q+ Y/ y
TRISTATE m_bUPnPDeviceConnected;
4 h( K! E- i: _# J- A4 G ]" {9 Z) i6 j: y9 X
6 Y' V. _$ W6 z; N: X2 Y6 f( V
// Implementation1 }! T: J a) ~/ `- b8 b
// API functions
) t+ g6 R; j$ m+ \ \( J8 n0 b; L SC_HANDLE (WINAPI *m_pfnOpenSCManager)(LPCTSTR, LPCTSTR, DWORD);5 I- D7 r8 q$ U8 p; s6 L2 C+ F
SC_HANDLE (WINAPI *m_pfnOpenService)(SC_HANDLE, LPCTSTR, DWORD);0 a4 K% i$ A/ J. Z
BOOL (WINAPI *m_pfnQueryServiceStatusEx)(SC_HANDLE, SC_STATUS_TYPE, LPBYTE, DWORD, LPDWORD);
' O1 @( e) }, i2 c1 u3 I/ M3 P BOOL (WINAPI *m_pfnCloseServiceHandle)(SC_HANDLE);
" A1 R* v2 G. T( J1 H, M, O BOOL (WINAPI *m_pfnStartService)(SC_HANDLE, DWORD, LPCTSTR*);
: l. X" A$ k; Y5 k BOOL (WINAPI *m_pfnControlService)(SC_HANDLE, DWORD, LPSERVICE_STATUS);9 Y( {8 F0 @5 S# J7 N% g0 v7 W3 w
' W, F; O& U3 X2 M! d# k0 P, W5 k( x2 I" {& g: M7 a
TGetBestInterface m_pfGetBestInterface;( w$ u6 G% X" V0 K7 {9 H( s! ? ^/ T
TGetIpAddrTable m_pfGetIpAddrTable;
4 d7 p1 M- F. f TGetIfEntry m_pfGetIfEntry;4 W8 M/ w/ G5 K8 g
/ _- ^6 L9 Q. e Q Z* |# C% e9 f" B F2 U# S$ Y. ^) V; Q$ p
static FinderPointer CreateFinderInstance();
- A* t1 S# X9 g3 x- s struct FindDevice : std::unary_function< DevicePointer, bool >
' M8 \+ J5 F' N/ w+ g {, F" I9 i8 g0 x) B# ?) P+ b, I3 i
FindDevice(const CComBSTR& udn) : m_udn( udn ) {}. j$ W' Y& L0 }2 g; N0 ]1 k0 E4 V/ m& C
result_type operator()(argument_type device) const
u, u5 P, d9 T* A { {" m k0 M" ^' ?( s: [
CComBSTR deviceName;
3 p. \( F9 `1 M HRESULT hr = device->get_UniqueDeviceName( &deviceName );/ l" i- s! M/ ~
" O/ F6 C$ [6 l; f2 L/ s! E& K o* u4 f
if ( FAILED( hr ) )
( Q( F9 C1 n, p6 n; e% N8 H3 e return UPnPMessage( hr ), false;
+ x0 B% ^+ I+ \5 ]1 S, |& v
. t5 p- [% q( n+ @: c
- O1 t" ^- \4 D" G1 ^ return wcscmp( deviceName.m_str, m_udn ) == 0;$ D6 P; I6 R# q: {& K5 Q
}
8 n2 R. L. [/ U, ?- m& } CComBSTR m_udn;
( @, D( D$ ^) S8 r8 T6 g3 v) h };
2 ?; N% l/ Q8 o8 e 0 v2 w. [: i: k4 p; {0 m' _) O
void ProcessAsyncFind(CComBSTR bsSearchType);$ @. A. r2 K( f8 x
HRESULT GetDeviceServices(DevicePointer pDevice);4 ^, g: j* e/ W8 ^% ~, Q$ I
void StartPortMapping();- B. M# ?+ M* e1 ?( K" I9 ~+ @1 \/ ~
HRESULT MapPort(const ServicePointer& service);
4 B V1 H7 t1 C6 j$ J0 P5 y void DeleteExistingPortMappings(ServicePointer pService);
+ R7 r/ e& u, t8 g v void CreatePortMappings(ServicePointer pService);
' o P$ _7 j5 u1 h9 t3 ~ HRESULT SaveServices(EnumUnknownPtr pEU, const LONG nTotalItems);; R4 N1 S* x6 p
HRESULT InvokeAction(ServicePointer pService, CComBSTR action, 1 y/ i" [; o1 Y; B
LPCTSTR pszInArgString, CString& strResult);9 A, Q; v3 [' i3 X( B% y P
void StopUPnPService();- w& c3 F5 V! m& e* S; S* A c
: H+ [+ U" v2 b) {* c
" Y! t1 y. ^2 D! e \4 q
// Utility functions# g, F0 s F* Z% x! r/ }; H' V
HRESULT CreateSafeArray(const VARTYPE vt, const ULONG nArgs, SAFEARRAY** ppsa);
' O5 D* r4 T1 x- J- U# |5 d3 G0 \ INT_PTR CreateVarFromString(const CString& strArgs, VARIANT*** pppVars);
) W. i& F5 Y! j% Z, U/ ^5 g2 d INT_PTR GetStringFromOutArgs(const VARIANT* pvaOutArgs, CString& strArgs);
X. j$ W5 h1 Y( V9 V void DestroyVars(const INT_PTR nCount, VARIANT*** pppVars);
# p' E) s+ O2 W9 f& \ HRESULT GetSafeArrayBounds(SAFEARRAY* psa, LONG* pLBound, LONG* pUBound);
' }) Q( H3 k# p* ~- k1 e HRESULT GetVariantElement(SAFEARRAY* psa, LONG pos, VARIANT* pvar);4 \8 G5 W$ Z7 b5 u9 m4 l
CString GetLocalRoutableIP(ServicePointer pService);5 g0 e H7 I/ ^9 h. e
1 H% E& M* G# c2 t2 O4 e& `- Z
' [, X7 C8 W) W; O: r! b// Private members
* ^2 X# C! v* R4 X9 K+ h/ Vprivate:9 Q8 V) b7 c0 v, k' {
DWORD m_tLastEvent; // When the last event was received?
, ]3 c' l2 r, p) n* f- R( z std::vector< DevicePointer > m_pDevices;
8 S) f, L9 A. J7 [8 J std::vector< ServicePointer > m_pServices;
$ n$ D( x+ A' N" m- \, S FinderPointer m_pDeviceFinder;
. `5 X; t* b% G4 T DeviceFinderCallback m_pDeviceFinderCallback;- @! B0 f2 X/ V2 M# G2 U
ServiceCallback m_pServiceCallback; f4 d" y. n& _ Q: b5 {
, H3 Q$ U5 O7 B/ m
; Z( F: t1 S2 u3 Y- l LONG m_nAsyncFindHandle;$ m9 S% c4 t# i5 P; p
bool m_bCOM;
5 L) w9 B: w* M, t. } bool m_bPortIsFree;
" B( x0 n2 {4 H5 q" ]6 N# j+ ?- N CString m_sLocalIP; |) |3 A1 ^ g
CString m_sExternalIP;
% c! B" b' C& X7 h9 t& d" } bool m_bADSL; // Is the device ADSL? v' h# u( _4 N7 c
bool m_ADSLFailed; // Did port mapping failed for the ADSL device?
& m4 ~/ j/ m0 U( ? bool m_bInited;7 ? } f6 `# u# T
bool m_bAsyncFindRunning;
" Q% U% Y$ z5 x HMODULE m_hADVAPI32_DLL;
* ~- G% Q+ D% k, g# Y8 l5 E5 } HMODULE m_hIPHLPAPI_DLL;
& {( j3 V. w4 o' Z% Z7 Z1 ` bool m_bSecondTry;6 ?! F/ c1 ?% o( ^9 ?/ f' w0 n: G
bool m_bServiceStartedByEmule;. q4 |8 W+ }3 o* [" b
bool m_bDisableWANIPSetup;
9 H) J7 `0 z/ c' N( p- V bool m_bDisableWANPPPSetup;
. |/ o8 K7 H; _8 `5 h k- g* h! c+ k
$ W6 {# Y/ p' ]2 {6 X8 E
};
: W+ q$ V$ W$ c# Y2 {. e3 g; L- g8 x* U6 R& m
/ s$ u, {7 J& {9 J// DeviceFinder Callback
' x e" x0 R5 y' r1 rclass CDeviceFinderCallback2 C9 V; [( j3 |5 r
: public IUPnPDeviceFinderCallback0 O0 {, ?9 w* m% g- s& f6 F6 _/ q
{# [" ~8 |* q# h
public:
* Y* L% `4 m+ }7 g8 `) E3 P CDeviceFinderCallback(CUPnPImplWinServ& instance)% I) Y7 b9 I0 o9 j' f# x
: m_instance( instance )
, p5 @* d+ ]% t; I& j { m_lRefCount = 0; }
( z& b- [9 F$ `0 O1 ~3 V* y, b! i1 b6 k3 g- I9 q+ a# Y& k2 @) Q5 X
) f2 j7 {+ M3 ?8 J8 k _: x
STDMETHODIMP QueryInterface(REFIID iid, LPVOID* ppvObject);5 Y$ e; M t1 m. l8 u% j# L/ l; j
STDMETHODIMP_(ULONG) AddRef();
/ a; _2 c) ^6 p2 S STDMETHODIMP_(ULONG) Release();
- V" N e+ F0 R, s. j e/ p) ~% c: L
( e# ^% i- O" q# T# W! X
8 M2 V& R5 ]. r( u0 W// implementation0 ?4 R' A1 y: g/ J. j& d
private: i/ v1 |+ o! }" R& h* W2 y- A1 o6 ~& E
HRESULT __stdcall DeviceAdded(LONG nFindData, IUPnPDevice* pDevice);6 a4 s/ j" ]: f9 v+ `9 v
HRESULT __stdcall DeviceRemoved(LONG nFindData, BSTR bsUDN);# `% b9 r; }9 \! L' q
HRESULT __stdcall SearchComplete(LONG nFindData);( f k3 p* ]* `! l& j/ i! p+ G2 C3 f
' J' l- q' I) r1 h# ^- W" H* ]* s
9 ?+ Q$ x8 j" t. c" }private:
8 _- f/ }* R% \+ u: j3 g+ S: V CUPnPImplWinServ& m_instance;
1 A& i" ^3 l! N. Y! v9 A LONG m_lRefCount;
5 \' o: J6 e* l8 i};! ^) C1 `8 r$ [5 o- H2 p- ^
/ @3 u0 c. {- s+ b, h" H
, X/ w9 f- P4 b" d
// Service Callback
: n; c$ N4 x. w9 Fclass CServiceCallback
x G# i) i R1 D : public IUPnPServiceCallback. I% P v$ H* r# ^2 j# ]
{5 g$ V. F3 t e" N1 c; c
public:
) U4 e0 j; d. s. {6 I CServiceCallback(CUPnPImplWinServ& instance). r$ y4 Y# F5 d' i3 _' t
: m_instance( instance )
9 R" k& E) ?1 @. W0 }3 a { m_lRefCount = 0; }( @% M3 V4 U3 Z
2 G+ N" F2 d; W/ V* I STDMETHODIMP QueryInterface(REFIID iid, LPVOID* ppvObject);$ A$ W% A! `' N
STDMETHODIMP_(ULONG) AddRef();9 I& t# S2 v; I" }
STDMETHODIMP_(ULONG) Release();1 y. w( G* A% L! |
6 D a9 h3 S- a* w, Z0 k
1 B1 ~" b+ J6 L+ j+ L( |2 g// implementation: ~, r& Z+ l/ s! o
private:* c9 D. }; y7 I3 p- o D* A
HRESULT __stdcall StateVariableChanged(IUPnPService* pService, LPCWSTR pszStateVarName, VARIANT varValue); \0 t& A1 ^; w2 n3 \ o
HRESULT __stdcall ServiceInstanceDied(IUPnPService* pService);" R: R. |/ R* D
0 a0 w0 Q! \$ ^, m- W
p2 }1 L3 h s8 j6 o& M- K* i$ @3 i
private:" Q5 e* q3 k e) F. W8 v4 M
CUPnPImplWinServ& m_instance;! K# P, G6 n) Z: ~- h9 w
LONG m_lRefCount;
7 R2 Y5 P w$ a- j% U( B( x9 ^ f};
6 D) a0 L6 O) t! O
; D0 w2 s) Y* Q5 k5 I
% c3 ~ s( J" y1 e/////////////////////////////////////////////////: q) k: {; a0 t, L% f* `
- p6 C3 z s/ h
+ X3 v' F6 c7 p# a1 l2 u使用时只需要使用抽象类的接口。
{2 h: K# @# b- G( G9 }9 g2 bCUPnPImpl::SetMessageOnResult设置需要接受UPNP端口映射是否成功的窗口句柄和消息ID.0 L5 }2 v. ]' ?
CUPnPImpl::StartDiscovery将开启一个异步设备查找并进行端口映射,其参数为需要映射的内网端口./ m3 n- x0 K* i# ]9 C9 h/ ]+ _( Z
CUPnPImpl::StopAsyncFind停止设备查找.
3 P: a4 F0 H* K) Q" eCUPnPImpl::DeletePorts删除端口映射. |
|