|
|
楼主 |
发表于 2011-7-15 17:28:52
|
显示全部楼层
以下有关upnp的接口来自emule,8 i2 p- @# _& r$ V) u) _
# b# n2 w8 s( g3 [- Q% V+ S3 O9 ^5 C8 G# ]! E8 @& u: P
///////////////////////////////////////////% J6 T/ c4 \" R
//upnp的抽象接口类,只需调用这些接口即可实现端口映射功能.
+ w# d* f2 i" h7 X3 _ W8 X3 n7 ?- F7 b% v) R
; B2 u3 r' J! G
#pragma once
) J, w$ [# A7 I2 N6 t% @# D#include <exception>9 e' J$ O, o* D# O( r0 ^0 X+ ?8 q
# i; q" Y# o2 L8 B7 P
8 D. B+ ^% K; \ enum TRISTATE{
( [' v s/ r# q% Q" c; { TRIS_FALSE,6 E- }" M1 ?3 O, r1 G8 r: Z# c
TRIS_UNKNOWN,+ z# L9 ]$ |7 d$ a2 T3 r+ }
TRIS_TRUE9 {% o1 \! h+ j9 G
};
5 V3 b a7 i2 y+ D$ l/ i+ V
: M5 ^( U P- R& Y+ A D4 {
) ^0 j" M+ _- D @/ N' @enum UPNP_IMPLEMENTATION{
( |7 l) `* [& ?$ j UPNP_IMPL_WINDOWSERVICE = 0, S8 X2 }" B! v
UPNP_IMPL_MINIUPNPLIB,1 q# I3 f5 z4 z, j0 w
UPNP_IMPL_NONE /*last*/# R- c# c+ b1 f9 w' D- J
};
! Y. h; v3 P* u. p+ B( O9 ~/ S- U0 K9 q5 C, ^
- d1 \* U( w/ U9 z0 H/ }* Z3 X* w
9 {) s4 q# f% B( y6 z8 {% }% D% R0 F6 y! m( ^
class CUPnPImpl0 g, ^ y) K; }- t3 s) @
{# \( j$ @' i0 `+ {# V, m
public:
T3 B6 O! ~9 `- U CUPnPImpl();
/ S* k5 A. U! `6 T$ M( m2 z& |& N virtual ~CUPnPImpl();
# N) b9 a4 d; d" b0 n5 u. G/ h struct UPnPError : std::exception {};# X0 Y' y2 i" I9 H
enum {
2 C/ G! N7 z1 L UPNP_OK,
$ j, C1 R8 ^& f- [/ m UPNP_FAILED,8 k8 w) w8 m7 c- C
UPNP_TIMEOUT- S8 _8 r1 }& c5 s: u' w
};
* h4 ]! L p# T- v( q. W+ a g4 T) k
N# I# F! }. }- F( @+ l
virtual void StartDiscovery(uint16 nTCPPort, uint16 nUDPPort, uint16 nTCPWebPort) = 0;
% M7 Z# _7 b6 q. A virtual bool CheckAndRefresh() = 0;
) _5 {) d# `( t- ` virtual void StopAsyncFind() = 0;* A, L* Y$ @' N) b1 ?6 B+ C
virtual void DeletePorts() = 0;. O I u$ m0 [0 R9 r' r* i3 V
virtual bool IsReady() = 0;
/ _6 x9 k1 {+ d- h( u8 H+ n7 a$ I, c virtual int GetImplementationID() = 0;
8 k4 t" ^; N8 Y! z8 e& M
7 @5 F0 K1 S0 n void LateEnableWebServerPort(uint16 nPort); // Add Webserverport on already installed portmapping
6 w" ~- w/ \5 w" Z$ d0 o
; ~) ^1 ?& K: f2 k- ], p
5 X7 w V1 G e+ R* Z( l* k+ f void SetMessageOnResult(HWND hWindow, UINT nMessageID);+ H5 Y, a. D& b
TRISTATE ArePortsForwarded() const { return m_bUPnPPortsForwarded; }1 G6 ^: v& |3 w% d) t, j
uint16 GetUsedTCPPort() { return m_nTCPPort; }
0 l8 }9 c5 [8 \9 t, ~ uint16 GetUsedUDPPort() { return m_nUDPPort; }
# a6 R5 Q# _, W! w/ y; \# H2 m6 R/ G/ {
" o/ r- U" g' f" g6 A `0 W6 d
// Implementation
* O% R4 G) [. W" nprotected:4 N+ ?. w/ C9 ]
volatile TRISTATE m_bUPnPPortsForwarded;
2 e3 K% h( f% d c void SendResultMessage();$ u( m: o8 C) s( I3 Z
uint16 m_nUDPPort;
# o, i/ z& _9 b) L, }0 ]7 N d5 i uint16 m_nTCPPort;
' Z; w0 N- u, d; J6 ]; x uint16 m_nTCPWebPort;
0 D9 U$ {) l, u9 |- m% e* x bool m_bCheckAndRefresh;
* t$ c1 |+ ^4 [0 F7 R7 Q: D0 c H. W, a
! {, l6 S, p& V2 I' p& X4 A+ x3 o
" @1 [" X+ K+ A! ~5 A1 Jprivate:
e1 a2 x, M& i% o, U: g HWND m_hResultMessageWindow;
% Y" I6 H) c6 W' @8 T UINT m_nResultMessageID;
' U+ [$ y" M2 ^
( k8 R: J/ a( R5 X+ F3 y0 ~2 R: a
3 l) C; E& f0 |6 }0 Z& x};* b! \0 X+ d, g; w) h2 x
4 L8 n& m" d( N y2 L2 x3 q4 h, z9 b+ M4 X0 v- N! r" t
// Dummy Implementation to be used when no other implementation is available
1 Y/ X% P/ C9 Vclass CUPnPImplNone: public CUPnPImpl
4 ~) Q1 v R2 s# u" Z6 c9 }+ w{6 L2 ?) `# S& f6 z. `
public:: x. L+ T* B/ k' W/ @" G
virtual void StartDiscovery(uint16, uint16, uint16) { ASSERT( false ); }
. t8 |7 Z8 J/ o5 X. D, p virtual bool CheckAndRefresh() { return false; }4 y( z3 _6 i6 `& }# C
virtual void StopAsyncFind() { }" X, M$ u0 e0 P8 h& k4 O+ h6 l
virtual void DeletePorts() { }
5 _ V+ h3 }7 C! G# N virtual bool IsReady() { return false; }5 N- H+ g) D# _1 ?, ~: V: j3 r5 s
virtual int GetImplementationID() { return UPNP_IMPL_NONE; }
+ B2 W3 p1 g1 s' p" A) N' T};
! ]5 X" r1 {: i% f. n7 E
5 K2 e' N2 e$ D1 {* V
1 O* v, O! t; T////////////////////////////////////// K8 z; N/ u# g" h7 s
//下面是使用windows操作系统自带的UPNP功能的子类
/ [, s9 A9 @6 s H+ L& P7 ^
5 k$ D3 C' x$ H& P( C1 a( O z
' H D# ]! b. ]& F, R' d, f* h, \#pragma once6 N2 M: V$ H6 ]" U" P2 t- R
#pragma warning( disable: 4355 )
, v- I" X' u1 M0 n( n5 A. W) H0 I7 O9 R% {9 T' E* O& f
& D( E, [- s! F: X' L7 V' k
#include "UPnPImpl.h"; ?" k3 x l& {' F, p4 ^" w. a! ?
#include <upnp.h>
" U9 K/ v5 [) Y#include <iphlpapi.h>
" {3 ?' a+ ?/ t7 H. j0 X#include <comdef.h>
5 h3 r1 H: C: `0 m: D f+ J& o#include <winsvc.h>
$ g: L- \3 i. S/ h7 ?5 P" h6 e% T7 H4 y9 |! Q
4 k4 R1 A/ q9 V% P$ N#include <vector>
- e1 |- G+ w6 b8 {& z4 x#include <exception>3 x f7 Y1 }: c$ m
#include <functional>
9 F* x' u. l0 `9 G) U" ?+ \; f' {) Y+ b3 u7 [& H
& n( U( ]& M6 ~" [* t* r$ [% c
+ o1 J) C( e4 e; b3 v
$ |4 b } M; R3 W/ p% h) ^5 ~4 ~typedef _com_ptr_t<_com_IIID<IUPnPDeviceFinder,&IID_IUPnPDeviceFinder> > FinderPointer;
, _/ F. I3 i8 f0 w6 R0 O4 ktypedef _com_ptr_t<_com_IIID<IUPnPDevice,&IID_IUPnPDevice> > DevicePointer;4 q% a3 y4 t# _! j/ I: o
typedef _com_ptr_t<_com_IIID<IUPnPService,&IID_IUPnPService> > ServicePointer;
5 B8 p# \9 l; {4 U9 K& w# I5 htypedef _com_ptr_t<_com_IIID<IUPnPDeviceFinderCallback,&IID_IUPnPDeviceFinderCallback> > DeviceFinderCallback;
, X p! b9 T: Otypedef _com_ptr_t<_com_IIID<IUPnPServiceCallback,&IID_IUPnPServiceCallback> > ServiceCallback;$ L+ t! H/ W9 _/ K4 [, o
typedef _com_ptr_t<_com_IIID<IEnumUnknown,&IID_IEnumUnknown> > EnumUnknownPtr;- _7 \: \# ^ @6 |2 m) _ W# J- D% {/ ?
typedef _com_ptr_t<_com_IIID<IUnknown,&IID_IUnknown> > UnknownPtr;
5 Q7 l5 p' N* U8 E; Z
+ R4 `8 p4 j! }( V7 M4 p' p4 N' C" V3 O5 n+ r9 g0 o# J4 [
typedef DWORD (WINAPI* TGetBestInterface) (: U3 e2 q# }0 l) s/ M% V( o
IPAddr dwDestAddr,
, N' o, ^; r$ H0 I' m3 G q- d PDWORD pdwBestIfIndex
; p" Q( R- Q! I% l$ Q);/ C. f+ G# ?5 P) b$ [0 a
" j4 R2 ? N3 n# ~0 s0 K
3 r6 B0 L- J3 b. Y- C3 stypedef DWORD (WINAPI* TGetIpAddrTable) (; S, X; p" O0 u, T# \0 S% U
PMIB_IPADDRTABLE pIpAddrTable,
4 y0 G7 H& c9 e4 T! E; \4 i/ R PULONG pdwSize,
: }& Y# O, Z7 X0 X BOOL bOrder4 W6 I) [2 d* C+ m
);* P( r* q/ k2 j
v- r9 K6 ]4 s2 Q2 M
* u5 s: ?( `+ I A9 {+ M* y
typedef DWORD (WINAPI* TGetIfEntry) (3 l- `# @5 o1 Y' Z
PMIB_IFROW pIfRow( d, y8 G9 T9 M0 v" G2 a$ b1 c7 j
);
& r5 L T3 O- t) ?" V9 s+ Z+ I9 r6 N
8 f3 P w; {5 C7 P! N
CString translateUPnPResult(HRESULT hr);
( k- Y; v6 h& i- p: {HRESULT UPnPMessage(HRESULT hr);/ H2 n0 l8 a0 K; f
* |4 j9 Y6 t3 y4 W3 ]6 B$ k$ K" @" f# D
class CUPnPImplWinServ: public CUPnPImpl3 z- ^ K6 T. s4 c
{9 A( X& V6 k0 q7 X
friend class CDeviceFinderCallback;
1 e: W1 x& y# b4 @7 P& w# ? friend class CServiceCallback;
7 f) L2 x2 @7 n// Construction( f0 @( X6 N- Q2 V: f# |/ R
public:
. Y3 }4 p) E& t$ ? virtual ~CUPnPImplWinServ();, P) q) Z9 J9 B
CUPnPImplWinServ();" n/ Y. F0 i% s: T
" M1 d) B! {- J
+ h" e0 ^# b: L9 s# ~5 F" ?) Q virtual void StartDiscovery(uint16 nTCPPort, uint16 nUDPPort, uint16 nTCPWebPort) { StartDiscovery(nTCPPort, nUDPPort, nTCPWebPort, false); }
4 K; q9 T& [! O0 ]8 f. O1 ` virtual void StopAsyncFind();/ P0 H2 A9 B V" J, r8 O2 k
virtual void DeletePorts();, N8 Q( ?6 T5 |0 e# V8 J
virtual bool IsReady();1 a. y' `7 ]/ K3 j& g) B
virtual int GetImplementationID() { return UPNP_IMPL_WINDOWSERVICE; }
0 x+ h+ L# P1 X8 _0 l0 v9 E# h! R' j" g! [5 c( r( Q4 l
; w: z0 P- U+ S2 n) C4 [0 E // No Support for Refreshing on this (fallback) implementation yet - in many cases where it would be needed (router reset etc) c0 ^% h) |7 z: k; O: o
// the windows side of the implementation tends to get bugged untill reboot anyway. Still might get added later
1 {) G1 D" R1 X7 ]* p" a" { virtual bool CheckAndRefresh() { return false; };
8 }" N% H' A. h1 q/ I* ~
$ N$ o9 f2 D5 p! ^$ R: d2 x+ |. p4 z/ D# c- ?- d, c; N; w* H3 X
protected:
7 m$ S( d* r1 F7 Y5 h( ^! _3 y void StartDiscovery(uint16 nTCPPort, uint16 nUDPPort, uint16 nTCPWebPort, bool bSecondTry);
( D/ e9 w( B& q9 R void AddDevice(DevicePointer pDevice, bool bAddChilds, int nLevel = 0);
& i, f7 ~- S2 V; S) f- H% m void RemoveDevice(CComBSTR bsUDN);
! `. |5 r4 ~2 X- G. Y4 I6 h: E bool OnSearchComplete();- k- N9 I& y( _; n/ E
void Init();
# G j$ }" Z F9 {5 x9 J3 g+ A
' V& X. N& t- r) a6 P' Y. f: ?; P, z0 J* x1 z
inline bool IsAsyncFindRunning() $ ]. E' b0 x$ v1 y! ?
{
* V' ~& U4 I7 Y, Q. P if ( m_pDeviceFinder != NULL && m_bAsyncFindRunning && GetTickCount() - m_tLastEvent > 10000 )
6 x# t, J) W7 l2 P1 Y: J) V% \ {& D$ z# w3 l2 V# o9 }$ ^; x8 Z% @7 A
m_pDeviceFinder->CancelAsyncFind( m_nAsyncFindHandle );
0 H& G. e1 J8 _. S, \- ]& h* q5 U: G m_bAsyncFindRunning = false;
`: M$ t: l. K& u/ q l }
) b& v7 X9 r" W) @' B6 m' ` MSG msg;, M/ e+ t% |: y2 Y
while ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
. D: V( A5 x7 l+ K O5 p {8 ~$ S6 q; R) e8 \9 ^
TranslateMessage( &msg );
8 K: F7 }4 i" N" P& {0 V9 `5 C DispatchMessage( &msg );2 h" A) p+ j# A" N8 E( U
}7 T& o; B! G4 x/ K
return m_bAsyncFindRunning;1 i" u. {$ n3 e1 @, k" `
}7 `, ^$ m: g8 |
0 M( c1 Q) J9 I+ F5 q/ F
* h! E6 G( d2 Z8 m7 S( Q& f$ { TRISTATE m_bUPnPDeviceConnected;9 w+ g7 r$ E- |1 }( i
, D2 a9 o- a, u7 ?2 _3 M( ^* k
" k8 E D. `3 V) B" R7 ]// Implementation! `& z) \& _9 O! x! i
// API functions( l6 N) \! e" w D/ ^
SC_HANDLE (WINAPI *m_pfnOpenSCManager)(LPCTSTR, LPCTSTR, DWORD); }( h& ~; w. y; Y7 E
SC_HANDLE (WINAPI *m_pfnOpenService)(SC_HANDLE, LPCTSTR, DWORD);
4 a3 x" c9 K% L+ M( m, s BOOL (WINAPI *m_pfnQueryServiceStatusEx)(SC_HANDLE, SC_STATUS_TYPE, LPBYTE, DWORD, LPDWORD);
& O1 B! O7 n+ p0 u! M BOOL (WINAPI *m_pfnCloseServiceHandle)(SC_HANDLE);' M* r/ x J- m9 @
BOOL (WINAPI *m_pfnStartService)(SC_HANDLE, DWORD, LPCTSTR*);
9 \( b4 H8 P; Z7 o2 v. Z BOOL (WINAPI *m_pfnControlService)(SC_HANDLE, DWORD, LPSERVICE_STATUS);/ \8 |+ v( T: O0 N9 e$ b! N& G4 @
( o! n2 S' F& q
; x& b8 L3 j" h+ d- O4 o
TGetBestInterface m_pfGetBestInterface;6 d! \& M( u( k% `0 W
TGetIpAddrTable m_pfGetIpAddrTable;
' b1 w) ]. h$ ?. Z9 U" k' n) N TGetIfEntry m_pfGetIfEntry;
/ H8 d4 _9 D4 C+ Y+ o- g+ f# x7 s; K% i/ I) d( D
! p$ [- q$ e9 ^5 O3 l' r
static FinderPointer CreateFinderInstance();# H- V7 @/ Q# Z! |7 E, p& n
struct FindDevice : std::unary_function< DevicePointer, bool >' T0 G- U8 h+ e- }( I
{7 J: e! _( d" s! ^3 l3 G7 u
FindDevice(const CComBSTR& udn) : m_udn( udn ) {}
( U6 F3 v ^/ n1 M; e; z result_type operator()(argument_type device) const
/ w! l) y' F8 ] {
/ d- {0 K7 T5 b CComBSTR deviceName;5 q5 N4 |: F J% h" p
HRESULT hr = device->get_UniqueDeviceName( &deviceName );* D" z& K( O0 `' {; A
' X( m$ J2 v; d1 a2 Y7 J
; E8 k0 [1 Q7 s8 d6 g( l6 ? if ( FAILED( hr ) ), ?. h6 s6 i+ l( t5 g
return UPnPMessage( hr ), false;; t F9 a% p; p9 b( p
# F7 [/ b3 n& s3 ]
; S9 }( E! }: o0 J+ x- m) e return wcscmp( deviceName.m_str, m_udn ) == 0;
) @8 X C. ?) J0 K3 _9 \ }. i; X, G1 o9 \9 H8 c" c
CComBSTR m_udn;. }$ u7 [+ |4 q8 ?' p. i9 y
};9 t; s, d6 K2 b
' C4 X- i- g8 C6 R3 m void ProcessAsyncFind(CComBSTR bsSearchType);
( ~9 k- U/ L. _% y+ r: n HRESULT GetDeviceServices(DevicePointer pDevice);
* C: `8 K. N: P# P void StartPortMapping();: Y. {+ N* E3 v% \; _* I1 h
HRESULT MapPort(const ServicePointer& service);
$ c/ Y! ]) v, P) E! O9 a! w% B. @ void DeleteExistingPortMappings(ServicePointer pService);
- L) a' d( A' E1 j- C6 N void CreatePortMappings(ServicePointer pService); o# V# M( ^7 w: Z0 N
HRESULT SaveServices(EnumUnknownPtr pEU, const LONG nTotalItems);
- v3 e6 R* X: H' Y HRESULT InvokeAction(ServicePointer pService, CComBSTR action, ( G7 Z$ J% g* w6 c
LPCTSTR pszInArgString, CString& strResult);
! g8 P1 Q4 n9 t7 I9 x& k+ a void StopUPnPService();
; m# t- P6 q7 y# N+ f! i
7 ^2 F ?4 r% m- u7 p: d0 B- ^* T6 m* f9 Q8 N+ u) C, z: v
// Utility functions4 h: x o A) A$ C/ c
HRESULT CreateSafeArray(const VARTYPE vt, const ULONG nArgs, SAFEARRAY** ppsa);$ ?5 B W! c. O: ?
INT_PTR CreateVarFromString(const CString& strArgs, VARIANT*** pppVars);
# _6 ?+ S: z& ^$ N) R, n( Y: Y6 H INT_PTR GetStringFromOutArgs(const VARIANT* pvaOutArgs, CString& strArgs);
. S+ U* M Z" x2 r4 R void DestroyVars(const INT_PTR nCount, VARIANT*** pppVars);* T3 E, f4 _7 }' W
HRESULT GetSafeArrayBounds(SAFEARRAY* psa, LONG* pLBound, LONG* pUBound);
; q9 q" ?3 t& Z# s8 t( |6 [ HRESULT GetVariantElement(SAFEARRAY* psa, LONG pos, VARIANT* pvar);+ G+ a [2 F9 X- y$ i- x
CString GetLocalRoutableIP(ServicePointer pService);/ l1 d b; |% V. i
9 Z" z! f* Z5 n6 D$ A# Q
. q, ]0 a7 Z$ f// Private members/ o, ~; n) f: Q1 y* m' F' Z4 M
private:6 M4 E+ |& x6 _5 u) Q3 V
DWORD m_tLastEvent; // When the last event was received?; T- D* l8 e* W3 M5 ~9 T C7 `( g+ Q
std::vector< DevicePointer > m_pDevices;+ ^7 J& }4 p5 l' `
std::vector< ServicePointer > m_pServices;- s& e1 u" d% i4 V# J# ]
FinderPointer m_pDeviceFinder;7 E2 T9 R, ^2 ~# J
DeviceFinderCallback m_pDeviceFinderCallback;' S7 ^) t/ o+ Z
ServiceCallback m_pServiceCallback;
& s. g; k+ M' H% `% c8 K$ q( I: ?& l* F0 d
* K' u. A9 x: `1 M% z D. K
LONG m_nAsyncFindHandle;
+ b z8 H! {* ]/ ?3 V) V bool m_bCOM;# m8 Q9 M7 R, w& G$ N
bool m_bPortIsFree;
% c; z; f, G$ L& }, D- \% l+ I' Z% b CString m_sLocalIP;) O8 L' H& L2 n/ t5 D+ G
CString m_sExternalIP;/ J- A+ D k. c5 \+ P
bool m_bADSL; // Is the device ADSL?
l6 Q$ N" r3 X bool m_ADSLFailed; // Did port mapping failed for the ADSL device?1 |# _1 H) m/ A& f
bool m_bInited;
5 \5 q9 b' u; X0 X# a5 q2 o bool m_bAsyncFindRunning;4 p( z. a/ L+ v5 m
HMODULE m_hADVAPI32_DLL;9 D; \6 y9 c( W/ \( F+ T7 m
HMODULE m_hIPHLPAPI_DLL;
/ r5 [/ o) @: y% r, d. V bool m_bSecondTry;
4 r s1 q5 J, D: c bool m_bServiceStartedByEmule;4 ] x, u$ b3 e h' \+ i
bool m_bDisableWANIPSetup;6 c' K- R6 s& k$ B0 `
bool m_bDisableWANPPPSetup;! s; B- s7 _7 T
* |( ?1 j" s+ V! f0 L( e# }$ ?
: j# s; D) i. F" }! J/ P};; M) ~) Q- f- W
. P# I9 s/ l" u5 K$ N. s' r+ L
4 v4 N" U& `- A+ m9 w// DeviceFinder Callback/ k7 R0 `$ i2 v& ?; [( l! |" `7 h
class CDeviceFinderCallback
7 V' t4 t9 r% v- } : public IUPnPDeviceFinderCallback
, C5 y+ ]. s- J/ p* D/ C{8 F# K$ l1 D$ E$ \
public:. g* |: l b# p2 I: b! T
CDeviceFinderCallback(CUPnPImplWinServ& instance)
. X5 Q1 [$ K/ R0 v : m_instance( instance )+ L" v; l3 H$ _- n8 ^
{ m_lRefCount = 0; }$ I; l- }* H9 V1 M8 V7 e- ~
* d \ s0 p" b- U. I7 _% q4 R
7 ~9 h9 y2 I) S. f/ u" \ STDMETHODIMP QueryInterface(REFIID iid, LPVOID* ppvObject);" Q; \( G1 p* ^2 l6 R. e% H4 f1 u9 o6 L
STDMETHODIMP_(ULONG) AddRef();; S: a# O$ d" U9 Z
STDMETHODIMP_(ULONG) Release();' J$ b, O: b' B( T2 h/ r
9 o8 h' ~# \/ v: z/ h
$ n5 T+ v/ [( X6 }5 I// implementation, _7 Y, X( q+ D! A5 m- Y3 H
private:
, R, i* |8 ?1 C1 s$ y/ h9 K: O HRESULT __stdcall DeviceAdded(LONG nFindData, IUPnPDevice* pDevice);; C: ^$ {" ]9 }5 z" [% A. P
HRESULT __stdcall DeviceRemoved(LONG nFindData, BSTR bsUDN);
: L/ Z' E1 z5 H" Y6 t/ l HRESULT __stdcall SearchComplete(LONG nFindData);
1 G. e6 x* b& @7 x9 D0 N& [. {+ }2 W) K9 \ f, G" J
6 L; G6 D$ d; i! ^5 aprivate:
- @* g2 L( F( {& S CUPnPImplWinServ& m_instance;; P% C' |( K4 B9 d) A5 J' h
LONG m_lRefCount;
, a! v, N9 J. Y/ F2 q};. v6 k0 W k5 A2 R4 i
- I2 P) k# u8 M5 `& S4 h0 |3 D/ W' ^
// Service Callback
2 C$ k/ S/ c. [( Nclass CServiceCallback/ c$ `( \7 N/ n4 I
: public IUPnPServiceCallback1 ]% \1 ~4 K X+ C7 G9 b3 h# l) C
{, H8 W% [! j7 Z+ h! _+ V! \
public:/ C9 r- }+ ] V4 z
CServiceCallback(CUPnPImplWinServ& instance)
6 O: x7 ?& k2 G0 i& f : m_instance( instance )
A# N5 l' u( W& Z" G" } { m_lRefCount = 0; }/ Y4 _' k) ~' X0 {: m' R
3 I& C }) [ I4 k2 F' p5 x* z
STDMETHODIMP QueryInterface(REFIID iid, LPVOID* ppvObject);, e9 S: |: b3 H; K( h$ ~
STDMETHODIMP_(ULONG) AddRef();
, S8 g& l$ X, W; ]2 j STDMETHODIMP_(ULONG) Release();
/ V+ K% a% `# M5 P0 B! l' [% I V) V, P1 O0 _0 U" z( N: D
8 i) U" E5 n' J! K// implementation' J8 h3 i( ]2 [' s+ { Z
private:: v' r7 i1 Q8 `; r) E3 |
HRESULT __stdcall StateVariableChanged(IUPnPService* pService, LPCWSTR pszStateVarName, VARIANT varValue);
& c' A5 v% M) _$ f0 N HRESULT __stdcall ServiceInstanceDied(IUPnPService* pService);
1 g; y g6 W* d. b- S. Q6 F
+ x* ^" ~* c& a6 {$ d& I
4 m9 `6 ]& |+ q1 M$ k# S# y7 |+ pprivate:
6 G. K# x$ Y5 c% Y- C7 K& y) q CUPnPImplWinServ& m_instance;- A% G9 X" }$ g) M5 B& e7 w2 ~# }9 I
LONG m_lRefCount;
L8 ]) C; n' t' a/ x};2 R# N7 T4 ]7 y
# i! e6 ?+ c4 F* K" w" }
. o& _- H4 R5 U. h# L3 P, v( l/////////////////////////////////////////////////3 C9 \* x$ Q4 W* K
% d& X" U4 d' D; M! r/ A; \$ V4 N" A, z) V0 ]9 z
使用时只需要使用抽象类的接口。
% t2 l% |8 s( R! k- l; d2 ]8 CCUPnPImpl::SetMessageOnResult设置需要接受UPNP端口映射是否成功的窗口句柄和消息ID.. f4 ]* w$ a8 a1 y1 C# _
CUPnPImpl::StartDiscovery将开启一个异步设备查找并进行端口映射,其参数为需要映射的内网端口.7 B3 U1 B, A- o; e N5 W; F Z! [1 e
CUPnPImpl::StopAsyncFind停止设备查找.
" E. u; J) i8 z1 K) G5 \2 H vCUPnPImpl::DeletePorts删除端口映射. |
|