|
|
楼主 |
发表于 2011-7-15 17:28:52
|
显示全部楼层
以下有关upnp的接口来自emule,) ^+ a- L& f% z6 Y+ v3 b0 ~
) k0 `5 h% n- X0 j, T% R% R. h
0 J, `: a5 T+ J2 z/ t3 g; F///////////////////////////////////////////
; b9 {$ H k' W) f2 Z//upnp的抽象接口类,只需调用这些接口即可实现端口映射功能.
+ ]3 F. Z+ C! {
. {3 D9 }1 M( ^
3 k6 Q( p* `# _. h#pragma once# I0 x% X2 g; ^* y
#include <exception>
! z" ?7 _; q5 T' B/ X+ `) U/ k6 h0 q
) @+ Q1 R9 u+ s6 |5 B% R+ b/ ~: ?/ y6 U, q2 h+ f5 }
enum TRISTATE{
' ?; P6 e% W( R/ S$ B1 O$ h; r TRIS_FALSE,
" d$ H2 |/ \* _! N/ \, e1 `5 u7 J" C TRIS_UNKNOWN,
7 [, j% w- M1 {! z) B TRIS_TRUE
% L9 N: o, T! K# P7 n8 K* y};/ i8 I. c2 E. U' n4 Y3 Q. A( S
4 V+ U$ x K5 v
* o& T: H7 g; d% R! w3 ?* P Fenum UPNP_IMPLEMENTATION{
" I, }- T# w `6 X- ]: ? UPNP_IMPL_WINDOWSERVICE = 0, d% a7 l% Q0 _# }9 `; J
UPNP_IMPL_MINIUPNPLIB,( Z. U+ N$ F: e% x l7 u4 N
UPNP_IMPL_NONE /*last*/
5 Z! \7 o$ J2 K" m. B2 i: W};
9 `$ d) m! F1 b7 f; |5 h9 H! o _/ d& M$ ?
' p: L: i/ z9 b8 m& o' D% q' w
: u- i6 n$ F" k+ w7 F3 K2 B% E( M2 d( b8 o! s" ?( _9 \
class CUPnPImpl) k5 c: x7 }, i& j4 ~
{
1 f0 }9 T' u' M4 U1 I6 {public:
/ `) ]: c& d7 b! n8 t' h' T CUPnPImpl();) q( `6 E( Q* L- N6 t, [$ j. x
virtual ~CUPnPImpl();; h* Y+ [6 a& H5 s% j
struct UPnPError : std::exception {};
0 T+ [1 t; F3 X$ r8 c enum {
' b( [4 \- O" w5 i4 D8 U UPNP_OK,
$ g+ d" u. H& X4 a# t3 E; t5 |: G UPNP_FAILED,% ?# A# z6 B9 k
UPNP_TIMEOUT, o& [5 a [- i+ h2 v$ D( r4 o# @
};+ ?, J9 V4 z8 ]! S' y7 o
- e# ?$ K! L) t3 E6 T6 w1 x
% v1 q! R; W. D' U virtual void StartDiscovery(uint16 nTCPPort, uint16 nUDPPort, uint16 nTCPWebPort) = 0;
$ s f5 W# Q6 _: |- j1 V virtual bool CheckAndRefresh() = 0;
9 j1 b" n) B* L3 | h9 b virtual void StopAsyncFind() = 0; F- \% |3 O+ ?5 ?& j' t$ ~
virtual void DeletePorts() = 0;
5 \1 O4 w( h+ Q2 e! C virtual bool IsReady() = 0;
/ e- B/ P+ m; N3 ^9 A* `* \) O3 { virtual int GetImplementationID() = 0;
: x; V( Q- q3 Z4 l; s* u
, p' i/ f8 f' X( g, H void LateEnableWebServerPort(uint16 nPort); // Add Webserverport on already installed portmapping
) U: v I; L' t; B) H) Z5 R- P6 a! O3 I/ M0 Y V9 D
7 t: r. j# s7 J+ b6 \
void SetMessageOnResult(HWND hWindow, UINT nMessageID);$ Y2 R: ~2 @- \9 Q; {. V
TRISTATE ArePortsForwarded() const { return m_bUPnPPortsForwarded; }
( M5 z, Q# o6 B; ]) |2 ^! R5 f uint16 GetUsedTCPPort() { return m_nTCPPort; }6 W4 ?) N: L8 q8 G" ^
uint16 GetUsedUDPPort() { return m_nUDPPort; } - a& S C" ~ Z7 t: y
5 O) e1 o% w: A' R) g( R. M
+ i" |8 P/ V8 ?// Implementation
0 d5 X) |) _& K4 I. r- qprotected:: e9 u V. Z2 L$ o; q0 m
volatile TRISTATE m_bUPnPPortsForwarded;
2 j) |9 e, ~3 h* G8 j/ w# y void SendResultMessage();! ^. F* G' ~5 _& a- o% Z+ p& g
uint16 m_nUDPPort;( F' Y" c7 v; R3 i5 J7 q
uint16 m_nTCPPort;
: F$ Z" P& ?) M1 s$ j1 }- C+ m# ^) i% @ uint16 m_nTCPWebPort;/ v, g U" L# c6 ^8 J0 E% p
bool m_bCheckAndRefresh;( _9 [ n% `, P
) y3 R" N) \2 j: S( y3 P
! l! G1 E; V; z# H. s6 v2 j9 y
private:: X, J+ X" `9 x; W' `' i
HWND m_hResultMessageWindow;* p, r' C0 J, K- y' Z1 c
UINT m_nResultMessageID;! A5 _$ b4 [( R. s- C
5 h- W" d* q; J# o% O Q, D
! {! x$ f) F8 W( w};+ P6 w2 d4 r; K( I
& ~" k- Q" m. `* `
1 \, \: W5 ^! K# ^ _// Dummy Implementation to be used when no other implementation is available
7 S( q& a }$ M2 s6 Aclass CUPnPImplNone: public CUPnPImpl
4 C4 |" h, f& z3 u T- t* U{
! y: l# H& z1 y# ~0 qpublic:' J8 R/ ]1 F- R0 {
virtual void StartDiscovery(uint16, uint16, uint16) { ASSERT( false ); }" n7 |4 q! ?6 _& a' e* z8 z* {
virtual bool CheckAndRefresh() { return false; }
) |1 f' h+ B( K! M4 A) l virtual void StopAsyncFind() { }
& z1 J' K, F) A3 o) X virtual void DeletePorts() { }" v8 b5 o" h. X9 L
virtual bool IsReady() { return false; }& f7 t/ P7 O/ V: X
virtual int GetImplementationID() { return UPNP_IMPL_NONE; }7 T' |5 I; ? M- Z1 W" R
};
- E: {: H% T2 \, @* H, z; d" @% y$ M, N! a
7 I( f) U+ b3 r; f
///////////////////////////////////// k e% m h- p9 {& Q
//下面是使用windows操作系统自带的UPNP功能的子类
2 W# j+ r8 O* V7 D( x: X- ?2 i3 M2 F$ U% }6 _% {- }! E- z* \1 K
% J, A [' v2 J8 m5 V
#pragma once
; V' ?$ {& j+ D; E3 O#pragma warning( disable: 4355 )
) p6 W$ g0 B' R0 ]5 W- r9 W [0 c: @- u3 Z
7 y' M% E. i% A' T0 r7 e) P" [/ i2 g# Z5 ]+ ~7 G
#include "UPnPImpl.h"
& m8 X" H) F+ G2 J( Z& G#include <upnp.h>
" C. q+ m6 [2 V# F7 g#include <iphlpapi.h>5 X3 ?- E4 ^ U- L4 H
#include <comdef.h>
+ @6 Q' i7 n1 ~9 D#include <winsvc.h>
2 N+ N$ L9 g, r3 {5 S: l7 F8 K% R8 y2 M$ ?/ G
: J: S+ Q$ i O v
#include <vector>' k4 A9 y8 s7 [, u
#include <exception>
, {) `; X0 Y; s* C7 @% `0 T0 j9 N#include <functional>. W# Z0 ?1 C3 I6 E
. T A: p" H' O. o# H
7 ?! I$ F6 H; Z
9 \& w* L) l' D! M9 i3 u9 K: ?3 D9 J! e
typedef _com_ptr_t<_com_IIID<IUPnPDeviceFinder,&IID_IUPnPDeviceFinder> > FinderPointer;( N7 f" A3 Z) g4 a P3 g9 z ?! b
typedef _com_ptr_t<_com_IIID<IUPnPDevice,&IID_IUPnPDevice> > DevicePointer;
0 H3 _& L0 Z7 j% u6 y% |9 ]: gtypedef _com_ptr_t<_com_IIID<IUPnPService,&IID_IUPnPService> > ServicePointer;5 D- \- g, U5 w( Y- T
typedef _com_ptr_t<_com_IIID<IUPnPDeviceFinderCallback,&IID_IUPnPDeviceFinderCallback> > DeviceFinderCallback;( r0 u, ]8 l( Q3 L: S
typedef _com_ptr_t<_com_IIID<IUPnPServiceCallback,&IID_IUPnPServiceCallback> > ServiceCallback;% k; ?0 N4 s' ~
typedef _com_ptr_t<_com_IIID<IEnumUnknown,&IID_IEnumUnknown> > EnumUnknownPtr;
5 ^: Z- B+ C" U$ {, Q. Ztypedef _com_ptr_t<_com_IIID<IUnknown,&IID_IUnknown> > UnknownPtr;3 W% ^2 A2 w2 K
h9 u. P" i( n& Y: }5 G+ V
+ ~& @2 O* a. O
typedef DWORD (WINAPI* TGetBestInterface) (
* R0 @6 x2 @0 X, M" Y IPAddr dwDestAddr,
- Y& S6 I( n2 a v. w9 ]3 d PDWORD pdwBestIfIndex& J! U5 D) W$ e5 _7 h( A
);2 J: g5 S3 P0 s7 V7 S
c9 R3 P" ^9 P+ _
4 L1 w2 t9 E+ y6 I" E* G5 i/ M! g- W
typedef DWORD (WINAPI* TGetIpAddrTable) (
2 s) E- h$ v; f ~; M0 Y PMIB_IPADDRTABLE pIpAddrTable,
5 Q Z# N9 v8 ?5 Q PULONG pdwSize,4 H$ M: b @0 f0 ?
BOOL bOrder0 d( _" @! {7 w8 w
);1 G" K# }$ t0 @4 b
% _" t9 a1 `1 U% |4 g
, ?( i4 ^& @, E0 b: ntypedef DWORD (WINAPI* TGetIfEntry) (
3 a1 S. `2 t7 F* ?, Z PMIB_IFROW pIfRow% d$ x' ~, K( I$ N; p3 H
);
' g. k% Z2 o7 B- }7 b! a3 r4 G
+ }& I. C1 }; b4 i5 ]8 x: C8 r7 t
* `5 I1 |/ Q, P V& A1 _0 jCString translateUPnPResult(HRESULT hr);
8 Q5 X: `3 K8 e6 o5 f4 IHRESULT UPnPMessage(HRESULT hr);
* o9 ~! y' Z C. a$ G' ^8 c. ?7 i1 x1 i; o9 l' e, z. v
1 e' Y( e$ |2 \; W! m% uclass CUPnPImplWinServ: public CUPnPImpl' k f, r4 u. }5 w
{' a0 ~% e7 K3 ?$ ~' l: \9 c9 m: n
friend class CDeviceFinderCallback;
# x8 ~6 Z6 }) f' ~& i& k friend class CServiceCallback;
^0 L6 L( e) V: ^& x6 Q( O// Construction
( c. z2 N9 M2 {7 M- ], ypublic:9 H! j3 a4 I+ f' ^ }3 H; `
virtual ~CUPnPImplWinServ();9 v8 E2 v2 i" ]0 t u! [
CUPnPImplWinServ();
3 x H2 C7 f, N, ]# m; d& E
/ ]+ j& G5 d. I' F1 ?3 Z8 v
+ w' O% [' }& R3 V. f8 Z: l; Z virtual void StartDiscovery(uint16 nTCPPort, uint16 nUDPPort, uint16 nTCPWebPort) { StartDiscovery(nTCPPort, nUDPPort, nTCPWebPort, false); }. z1 B/ f! {/ M4 O1 W+ k
virtual void StopAsyncFind();& p3 C! I4 U& A! @3 D: ~+ n
virtual void DeletePorts();' Q. s1 r; m+ K5 p" Q+ w( _6 A
virtual bool IsReady();& V2 @: |& S3 z# h; u1 c7 }1 o
virtual int GetImplementationID() { return UPNP_IMPL_WINDOWSERVICE; }
/ i K+ l0 O1 b( A9 _/ [3 d2 Z5 e* e0 q- I q
- W7 T8 A; k9 z2 M- ?
// No Support for Refreshing on this (fallback) implementation yet - in many cases where it would be needed (router reset etc)" B. i/ B! [. J$ S2 x1 `% r# m( R
// the windows side of the implementation tends to get bugged untill reboot anyway. Still might get added later) g& n T! m2 b2 d, a5 U
virtual bool CheckAndRefresh() { return false; };
- L, [8 f% }' B' b
7 g8 H4 u% B7 X" D: ^* u# L5 x' L+ r e
protected:
) A8 r/ D9 F" } void StartDiscovery(uint16 nTCPPort, uint16 nUDPPort, uint16 nTCPWebPort, bool bSecondTry);
9 Z* S( z1 u x void AddDevice(DevicePointer pDevice, bool bAddChilds, int nLevel = 0);
* i* n7 \+ M3 r9 s; u" o U: E void RemoveDevice(CComBSTR bsUDN);7 J& m1 L" z4 {
bool OnSearchComplete();
. \- `1 Z$ m' o void Init();
2 u! s' ?4 @8 O3 p8 l) Z& |2 l9 F
+ O& p. O6 M% u6 c+ T
/ h8 s' _1 ^) t- |- Q inline bool IsAsyncFindRunning() : Z8 _( M. f1 m& S
{' F+ J5 k T# s% o/ `7 H2 n0 }! L
if ( m_pDeviceFinder != NULL && m_bAsyncFindRunning && GetTickCount() - m_tLastEvent > 10000 )
- e) l- S$ F" E2 X2 R8 e {( w4 c2 S- A- V: _3 @7 O
m_pDeviceFinder->CancelAsyncFind( m_nAsyncFindHandle );
& ?2 X( a5 C% I8 f! K! X" c m_bAsyncFindRunning = false;9 n2 g) v: P9 O& b* P/ y
}
9 h% M: j) S3 \1 [$ A p MSG msg; |4 K K1 v; J
while ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )5 x" x( G% c+ o
{6 u8 e) Z; _' H6 L9 [& L K
TranslateMessage( &msg );0 k/ n. h$ F0 {' G, b
DispatchMessage( &msg );
" L7 q! P9 H/ U' z }
2 i; A6 D. |- E' }7 C9 E' U- w8 ]+ o return m_bAsyncFindRunning;
. e; n5 }9 a& V4 C, T& t! m }
$ T9 d' p0 H* W5 l4 U I( e3 I2 ~6 T% F u, [ z* j
: f. \" T) \% c! l' w TRISTATE m_bUPnPDeviceConnected;
+ Z% z8 ~+ r* ~4 a1 u
; Y- @9 L! b2 ^ B! } P# S8 Q7 l% J# q) T$ A% Z$ R
// Implementation5 P/ H. o0 O1 R l: D
// API functions
0 j: I: _7 @% M, C, ? SC_HANDLE (WINAPI *m_pfnOpenSCManager)(LPCTSTR, LPCTSTR, DWORD);
) A3 W0 `' D' ~$ \5 a! B SC_HANDLE (WINAPI *m_pfnOpenService)(SC_HANDLE, LPCTSTR, DWORD);
1 g$ b6 ^0 \4 [/ s BOOL (WINAPI *m_pfnQueryServiceStatusEx)(SC_HANDLE, SC_STATUS_TYPE, LPBYTE, DWORD, LPDWORD);
l) }5 p/ U9 K4 r7 P. m1 x4 ^ BOOL (WINAPI *m_pfnCloseServiceHandle)(SC_HANDLE);% q8 C+ P- L; h9 ?, r4 Z1 T' m
BOOL (WINAPI *m_pfnStartService)(SC_HANDLE, DWORD, LPCTSTR*);
8 F6 J9 A% L8 p( B" ~ BOOL (WINAPI *m_pfnControlService)(SC_HANDLE, DWORD, LPSERVICE_STATUS);! U5 ^. h4 X" ?
/ r% O+ Y: A* T' f, c) ^, h$ K- F
( v7 C, @! N( D" `1 r, r5 f' _! K TGetBestInterface m_pfGetBestInterface;! Y1 i% P0 a0 [6 g7 C# e I9 v
TGetIpAddrTable m_pfGetIpAddrTable;
% l9 g% r) U0 l% i! A6 a TGetIfEntry m_pfGetIfEntry;& R5 q g ?6 u5 Q9 S' F# G
" K( q- {& E. S
% r; r/ K! w6 y# s& k" ^! Q( B) a static FinderPointer CreateFinderInstance();
/ o J$ r& m- r5 E3 r* j K- p# E struct FindDevice : std::unary_function< DevicePointer, bool >
0 u# a% j- i- a! y% F {
# U0 s+ I6 \8 D5 l FindDevice(const CComBSTR& udn) : m_udn( udn ) {}# z1 g4 b2 G& J; J" ?
result_type operator()(argument_type device) const2 b& r1 H3 h5 k6 r# q0 X
{ ~: P8 h# V+ y2 m
CComBSTR deviceName;
8 u5 h/ \9 M6 S; l' M( Z9 O; ~( _ HRESULT hr = device->get_UniqueDeviceName( &deviceName );1 Q" C) @8 z1 B1 b B
6 {9 ?+ g) G! t5 J! q" Y% X" A, J
# z" P* f' f) r+ v: G/ r( X if ( FAILED( hr ) )7 N3 w& Q5 E( X
return UPnPMessage( hr ), false;+ v9 O! a6 M7 p( @+ l: I
1 [* F! l- n) D9 {0 Y0 Z* r
9 ~+ K1 L) S* t$ ?, Q: i! c return wcscmp( deviceName.m_str, m_udn ) == 0;
" p, y) v; ]: h6 N- r- j }+ Y" D0 Z5 P6 r, F. M
CComBSTR m_udn;( e& A7 D; g; d
};9 H: {& p# l' c o2 }0 ~
' V' p7 ?: H5 Q9 d* {1 V void ProcessAsyncFind(CComBSTR bsSearchType);
. a e- g& e4 B# x6 I" t HRESULT GetDeviceServices(DevicePointer pDevice);
u, E1 R G0 {8 o/ V void StartPortMapping();& U* _" j+ T F, `+ g/ B
HRESULT MapPort(const ServicePointer& service);
- X9 {7 S6 {) V# ]5 z; J) b void DeleteExistingPortMappings(ServicePointer pService);2 t, P; J- i* p; i! N; I, h9 N
void CreatePortMappings(ServicePointer pService);$ M$ U5 F& v* z* j7 J7 \7 Q* s
HRESULT SaveServices(EnumUnknownPtr pEU, const LONG nTotalItems);
/ {" r: H' ?: r" s HRESULT InvokeAction(ServicePointer pService, CComBSTR action, 9 | s8 D: x* }* X* O$ t# c
LPCTSTR pszInArgString, CString& strResult);
9 x! O, h9 P7 \0 W, D; R void StopUPnPService();" P" ?3 `' o) I& \5 R2 Z
2 M5 I/ ?5 J9 g) L
, C* f# @- }/ |
// Utility functions
- P7 q0 }( u0 I: p! v& W! K( Z4 s% i HRESULT CreateSafeArray(const VARTYPE vt, const ULONG nArgs, SAFEARRAY** ppsa);% X; I1 z. l7 p5 Z, D5 J
INT_PTR CreateVarFromString(const CString& strArgs, VARIANT*** pppVars);
* G! B7 m1 Y, I INT_PTR GetStringFromOutArgs(const VARIANT* pvaOutArgs, CString& strArgs);
; Z3 \, F1 A' \' O% ? M void DestroyVars(const INT_PTR nCount, VARIANT*** pppVars);
6 U. t" Z! n! ]9 X2 z3 r HRESULT GetSafeArrayBounds(SAFEARRAY* psa, LONG* pLBound, LONG* pUBound);$ w5 G) T" f. G, e8 {0 [2 f4 Q
HRESULT GetVariantElement(SAFEARRAY* psa, LONG pos, VARIANT* pvar);
. p* x/ D, h ^: j CString GetLocalRoutableIP(ServicePointer pService);/ }1 Q o3 ]0 x; a
7 x: C7 s0 C! l+ d$ ?* n3 N* G/ d, b( p2 w1 F8 J7 F T, H
// Private members+ r9 F5 \' P4 ?/ {
private:$ h( Q, b; n0 x/ R
DWORD m_tLastEvent; // When the last event was received?
3 |" j! ^/ f( a- K std::vector< DevicePointer > m_pDevices;' j3 h) s9 S1 {: v9 Y# J6 O# q2 I$ V
std::vector< ServicePointer > m_pServices;& w# z! }( U$ M3 s
FinderPointer m_pDeviceFinder;4 O) ~4 ~. _) \3 ^8 F( P
DeviceFinderCallback m_pDeviceFinderCallback;$ K' s f2 B8 x* {' u, {
ServiceCallback m_pServiceCallback;
. {0 e9 u8 b Y: U
/ u3 s. m( I" \, v( l9 {6 W
g2 W$ a" s$ y* k, |. F LONG m_nAsyncFindHandle;/ x% b" x( n6 |$ p) E' ~; u
bool m_bCOM;% S$ f% Q6 w7 J7 m; T" h- n0 V
bool m_bPortIsFree;" f l. n7 p7 a6 J' g, n7 o4 ~
CString m_sLocalIP;6 Y) u6 X7 G3 |+ j
CString m_sExternalIP;; n& ]( T2 l2 R7 K2 p
bool m_bADSL; // Is the device ADSL?8 S/ e% b3 ^) e+ H9 @7 |
bool m_ADSLFailed; // Did port mapping failed for the ADSL device?- |1 I1 {; G/ |/ x
bool m_bInited;
+ ?* z& K9 q3 [- E( u; B bool m_bAsyncFindRunning;
: \0 `0 Y$ K2 ^2 i' `% P& G HMODULE m_hADVAPI32_DLL;
, x. b* g0 l* \. o* q$ X9 u4 ?# N HMODULE m_hIPHLPAPI_DLL;
' T4 N0 T- q( Q# h3 i% f( s, p" e bool m_bSecondTry;
0 N. q5 E4 i8 P o6 } bool m_bServiceStartedByEmule;4 o# w/ D4 t3 T* m6 b* z+ ~- }
bool m_bDisableWANIPSetup;0 a; I2 T1 v' f: l/ {- R
bool m_bDisableWANPPPSetup;; {- x; g( @: C# `1 n# d1 k; t
2 F6 s) n/ A' G% T- z$ {
" \% W: r6 j1 b* ~7 L& g};
4 H- i; b8 D& E2 z! D* k1 M( l) `
: S: i; [( q% K; y
7 W3 M+ \2 u$ z4 e, w8 L' l$ g// DeviceFinder Callback1 ~/ q( H' c6 [0 @* G p
class CDeviceFinderCallback' [. ?+ x2 B) A! d
: public IUPnPDeviceFinderCallback+ l; v) b9 x$ }* G6 a
{
& k! _- j! i [$ Apublic: z' W4 @) U' ]) P7 K
CDeviceFinderCallback(CUPnPImplWinServ& instance)! ]( r3 k3 ~3 ? U3 a! e
: m_instance( instance )% p* Z/ R; S+ d4 Y
{ m_lRefCount = 0; }. ?0 e2 S, x' n5 h. a
. _7 e, c# m o3 }3 @9 d1 z
$ v7 l; @. |; ]" c# P4 t3 W STDMETHODIMP QueryInterface(REFIID iid, LPVOID* ppvObject);
% ^. w1 R9 p4 s0 i' G6 d STDMETHODIMP_(ULONG) AddRef();
, U$ v5 W* s2 _ STDMETHODIMP_(ULONG) Release();) h: n" X1 K* G9 e& \& m1 s
( G& G: L) X6 u3 k: C
) P* H7 ?4 L1 O9 I// implementation7 y. g# w7 @/ J7 s ~5 P
private:
3 |0 W+ u1 Y0 K; P) |: d) g9 y4 D& y HRESULT __stdcall DeviceAdded(LONG nFindData, IUPnPDevice* pDevice);
# x% ]% ]3 u* f7 ], K- G. f# U HRESULT __stdcall DeviceRemoved(LONG nFindData, BSTR bsUDN);' L1 l% k) M; A/ a% n2 C9 i
HRESULT __stdcall SearchComplete(LONG nFindData);
. Y! Y$ c+ r( z- ]- b; ]: T+ S R" M( H9 e& K
- H! I# V! Z+ {% Cprivate:
: G6 h; V& @) m CUPnPImplWinServ& m_instance;
! D/ n% Y: s9 x: @9 `0 g" K LONG m_lRefCount;
5 A* B. F2 {- g6 w+ s- b, y};/ O2 y' l# W! P% c9 q+ j+ H
" q* a; Z T/ [# l
& |& W) {1 @7 T1 c' g: Q7 w, c// Service Callback
0 _: |. m& a: l7 Q- ~% H0 K/ Wclass CServiceCallback5 A5 `' X- K9 S6 z
: public IUPnPServiceCallback9 w. ~' p- P( j/ y
{. ~4 m8 O( }+ C
public:
! m9 A! Y5 E/ C$ ?$ y$ I4 o CServiceCallback(CUPnPImplWinServ& instance)
( {2 A% \# P& w : m_instance( instance )4 r2 @/ J0 j7 {0 a+ i% G `
{ m_lRefCount = 0; }0 X7 M( [: k/ Q) U- a* n0 @
+ V6 U: ~ u; x
STDMETHODIMP QueryInterface(REFIID iid, LPVOID* ppvObject);
5 V; h C4 {% I" X% `) x: r: H' o STDMETHODIMP_(ULONG) AddRef();3 t# C# T/ q2 B2 F. N9 `7 t* c- [* h
STDMETHODIMP_(ULONG) Release();4 z2 E C" F' B, A+ \9 @2 @$ t
1 c) Y3 G: Q: `4 W6 @! Q. n, V
! |) H+ |5 s; C! `// implementation
- ?* v& k X" q, Xprivate:
9 e" A& X0 u1 K, X HRESULT __stdcall StateVariableChanged(IUPnPService* pService, LPCWSTR pszStateVarName, VARIANT varValue);1 V/ l! T/ n8 J' m
HRESULT __stdcall ServiceInstanceDied(IUPnPService* pService);
* [& ~/ i0 \ l# |
/ C$ p& S* k5 t5 B, x
# P( }/ F4 Y. [! m( h lprivate:
# L& T: M, s4 ]% G1 b' f( N CUPnPImplWinServ& m_instance;
6 f z1 |* O. |4 V7 D LONG m_lRefCount;
7 h9 W3 _6 S) Q; Q/ V* \};
& D& f3 E) T7 ]) J: \' U o- K/ R3 d: z0 ~
& j" Z8 ~- f* y2 l2 g0 J* X& z: i8 U/////////////////////////////////////////////////* l) l4 ^8 K2 d, |7 U% @: G' Q! @
4 @* s! h, g) g" C* ^' n2 z# }( U* T+ K" }7 `& u# b0 ~7 c
使用时只需要使用抽象类的接口。/ c; Z- K. w+ |& `! x7 T; }
CUPnPImpl::SetMessageOnResult设置需要接受UPNP端口映射是否成功的窗口句柄和消息ID.. w( c: K$ i! m
CUPnPImpl::StartDiscovery将开启一个异步设备查找并进行端口映射,其参数为需要映射的内网端口.
3 U+ `& O8 V; Z" r5 f' ZCUPnPImpl::StopAsyncFind停止设备查找.( P6 g* F9 I. ?2 L, _
CUPnPImpl::DeletePorts删除端口映射. |
|