|
|
楼主 |
发表于 2011-7-15 17:28:52
|
显示全部楼层
以下有关upnp的接口来自emule,
/ v: _6 Q2 D( M. c. T+ ?# Z% d
7 U s3 _' X: |( ]1 t3 {- s' w0 U' e$ q8 _
///////////////////////////////////////////; L. {& X# }1 r* [* b& J. u
//upnp的抽象接口类,只需调用这些接口即可实现端口映射功能.) D) y0 h' N6 W' @
' ]; B3 T" w t2 i5 Q3 O9 c2 e( o7 O6 q6 I0 A
#pragma once8 v. Y8 n. |2 U' L9 `# C/ ~ ^
#include <exception>
1 n2 d5 n- [6 m9 ?. o* U1 e
% k$ R I7 f' M7 u0 T. K* W; x6 W# W
( z: t& y0 f& o% `! y$ } enum TRISTATE{
' S& [" U! i. T- R TRIS_FALSE,
. G) s% t' ^$ }1 o2 o7 N TRIS_UNKNOWN,
; o4 S; q) B+ ] O TRIS_TRUE! n7 `" D, e9 `$ E0 \
};% c& s3 X2 u' P8 }
7 m+ y* E6 C2 c" v- Y& E4 v6 H
' n: \! u" @8 T" T9 Y) B2 ?( Benum UPNP_IMPLEMENTATION{8 t5 N/ P& ?- b8 X" N# n, u
UPNP_IMPL_WINDOWSERVICE = 0,
5 e" C) G7 ] U$ I& N; G( B. A$ U UPNP_IMPL_MINIUPNPLIB,
2 E+ ~7 V( q/ Y) q& J4 f( W UPNP_IMPL_NONE /*last*/7 W- P. ?3 _% s
};- L- U N# O, h9 V5 M: S: S
! K! N# t8 s: I5 R: {% p4 h
) K5 R" R* \, y* H; i' g( ~! w y3 y: C2 T+ h/ P: B* o) m
% W0 ], D1 n! H/ T0 Vclass CUPnPImpl6 z2 p P% s# U* R, `2 T0 E6 d8 x
{' |; G S4 Z$ m* L. y$ G8 u( Y) K
public:# a3 m% y, M& b9 f& T- P
CUPnPImpl();
0 v ?( z! r; Y virtual ~CUPnPImpl();
( ?: u( `# o) l/ E& ^* p. I struct UPnPError : std::exception {};
$ \, w/ W( b3 f# p. L M, i enum {5 Y. x' b2 o# `7 ~1 e. T
UPNP_OK,7 e% n% Y1 V0 j5 b" g- n0 y
UPNP_FAILED,
# I; [* \* j& E* k$ C2 E# Z% y UPNP_TIMEOUT
4 G8 a7 q2 U+ T% ^3 o D4 E/ | };
, X9 s1 w# L+ H" S2 v& C- }4 h
. q9 i8 [ t5 p! o7 e, ^
7 V0 z1 j1 j3 r5 n4 l, \ virtual void StartDiscovery(uint16 nTCPPort, uint16 nUDPPort, uint16 nTCPWebPort) = 0;
- p( d% q# T8 k. T. g% L, g$ z5 L virtual bool CheckAndRefresh() = 0;
7 O) Y6 u8 K; t: f virtual void StopAsyncFind() = 0;& t$ _, _' I; z# k. R! v' h
virtual void DeletePorts() = 0;
7 ^, R, [, R9 N, S- @! O M virtual bool IsReady() = 0;, Z, c/ |- m! G' Z
virtual int GetImplementationID() = 0;8 [! ?" @0 S# @/ P' _; }% s
# [+ i, {4 D8 w* I% I- @ void LateEnableWebServerPort(uint16 nPort); // Add Webserverport on already installed portmapping6 z, p# ]8 p6 g! |
. A. Q# }6 A* \+ f' n
' }5 F6 y1 R6 h; l8 w$ S/ ? void SetMessageOnResult(HWND hWindow, UINT nMessageID);7 v( x* v. R) b7 |1 ^7 a8 `! b- B
TRISTATE ArePortsForwarded() const { return m_bUPnPPortsForwarded; }
" }; j. f9 `% T6 z5 r: N uint16 GetUsedTCPPort() { return m_nTCPPort; }9 s7 S, ?7 q) e. D& }
uint16 GetUsedUDPPort() { return m_nUDPPort; } / s( W! u4 \* X' N, W
6 V- c9 t$ i4 l& q7 Q, g
8 v9 P) C. D# ]
// Implementation
4 O3 u. S, Z; X' z) iprotected:' m! ^2 |( q* I1 ~5 v; A
volatile TRISTATE m_bUPnPPortsForwarded;1 Z, O: _5 {3 t- N: {9 _. R5 v
void SendResultMessage();
" i' n6 m" e- J' f9 r uint16 m_nUDPPort;
; _: ]1 a% f2 g0 {$ a& j uint16 m_nTCPPort;
6 L6 I0 M8 [- I0 v$ t uint16 m_nTCPWebPort;% L" C/ s2 n; q* l8 r9 U
bool m_bCheckAndRefresh;/ i3 B$ a, L6 b- D3 ]; U" Z
! W& | ~! n1 R9 D, x
; }$ R+ g: K: ]* r% Y4 M$ Bprivate:+ Z V" w \$ {/ ]) e8 B8 r+ M7 D
HWND m_hResultMessageWindow;
5 y c3 }5 o0 A/ E7 x$ Z3 _7 [ UINT m_nResultMessageID;
" J6 L! M4 n/ P5 H9 U y" B2 P: ]( Z- P+ y6 V3 m" L
( g% \5 I/ C+ Q7 S};
: b+ Y4 b. }0 F1 K+ Q. W" ~. X) n U
# Q$ H# ?" T# ?: V4 E% G7 [: o% O
- p" p, E7 W4 u C: T// Dummy Implementation to be used when no other implementation is available
; N$ R# @& L9 f3 U2 M$ h; dclass CUPnPImplNone: public CUPnPImpl& p/ R7 b' t% J/ P' E! f
{
1 ]! P3 E: S7 a! x# U3 d8 i& Z; Zpublic:: n: i7 a; e$ f$ v7 K/ m1 V* K
virtual void StartDiscovery(uint16, uint16, uint16) { ASSERT( false ); }# R( z, T- g/ }8 d- i# T5 |' v/ C2 B
virtual bool CheckAndRefresh() { return false; }
) o/ b0 X% [& k5 y virtual void StopAsyncFind() { }
' ^9 H. B8 r2 [ j3 U& ?5 h2 T* F virtual void DeletePorts() { }& I6 t, l2 B! q6 w4 {: W( O
virtual bool IsReady() { return false; }
" Z3 U; ~, E: }) } virtual int GetImplementationID() { return UPNP_IMPL_NONE; }
# }) b+ l; s, J};
( z4 v! ]: B5 {+ g' @+ F
# V( S8 n; N" R% F) ^- e @
3 B, o9 g8 n# V9 t1 B# R/////////////////////////////////////9 @& T9 `3 b. o2 M C5 S/ l
//下面是使用windows操作系统自带的UPNP功能的子类
1 \, E4 }" O( G6 u. C2 |9 {( }! {: c/ b
% d& `0 e* s z$ x8 u7 J% @. j#pragma once1 u8 u& H( l d' {. O" h
#pragma warning( disable: 4355 )7 V ?1 p! }/ ]* w$ P
0 D8 h3 n6 M% J {3 m* v
' P2 R4 f, N8 M. l% n#include "UPnPImpl.h"
/ e1 {, C2 c# p- \#include <upnp.h>
d; k8 j8 K% c6 d, _6 r#include <iphlpapi.h>
* E2 a" N L6 t- L8 l2 @- X" s: j#include <comdef.h>
1 z5 q4 G& `! x, q#include <winsvc.h>
( u% A. v: c7 w8 ]$ |0 _8 e0 m9 s- A7 m2 m9 e
( f- Z: ]8 p' g6 Q! Q0 a' _. z
#include <vector>$ b& e. z; z" U* k
#include <exception>" f1 a5 ~& F4 B
#include <functional>$ z6 w5 d) H& z
$ t3 x+ u4 f- }7 ]% V2 d0 A4 w% N7 [1 }0 Y9 a! h9 e+ Y: T
" X- z5 t6 p: [
5 G8 N' W) ]4 m/ }( n! q- \- c
typedef _com_ptr_t<_com_IIID<IUPnPDeviceFinder,&IID_IUPnPDeviceFinder> > FinderPointer;% [3 S6 k7 F/ U3 H7 k
typedef _com_ptr_t<_com_IIID<IUPnPDevice,&IID_IUPnPDevice> > DevicePointer;7 t |* u% I2 R& B
typedef _com_ptr_t<_com_IIID<IUPnPService,&IID_IUPnPService> > ServicePointer;
3 `7 ]/ e6 ]: e$ d6 P3 ztypedef _com_ptr_t<_com_IIID<IUPnPDeviceFinderCallback,&IID_IUPnPDeviceFinderCallback> > DeviceFinderCallback;/ h) E P4 ]/ G% Y+ `1 y6 S
typedef _com_ptr_t<_com_IIID<IUPnPServiceCallback,&IID_IUPnPServiceCallback> > ServiceCallback;
3 w7 f; @1 D, A ktypedef _com_ptr_t<_com_IIID<IEnumUnknown,&IID_IEnumUnknown> > EnumUnknownPtr;& N2 c- G) ]$ ?. [- f8 Y
typedef _com_ptr_t<_com_IIID<IUnknown,&IID_IUnknown> > UnknownPtr;
: I' K/ f5 [* h* r+ n) j" t4 I& T
4 O4 ?1 @) R9 {8 s- B# T. Z9 [( d. s( l/ V G) Q
typedef DWORD (WINAPI* TGetBestInterface) (1 q; t! y s, I5 @# a6 u) c M& e$ o
IPAddr dwDestAddr,& K9 V: B. D! ~
PDWORD pdwBestIfIndex
& B* U, `6 k, R* t! |);- x; U6 B" e1 a& d8 \
$ k% h; [5 z& u. O" u
, W. A( u& ^$ Jtypedef DWORD (WINAPI* TGetIpAddrTable) (; A4 |' B P- O6 x6 Y: x
PMIB_IPADDRTABLE pIpAddrTable,
: W7 w5 L. @$ Z$ ^ PULONG pdwSize,/ B6 V5 N, u2 m) p4 k' p
BOOL bOrder2 x& S8 I2 e6 N/ g/ q
);
. b8 Z3 u, p- r4 ?' R, X. r
* D0 M5 S6 L, g9 t2 m# P. y1 p1 x% H
typedef DWORD (WINAPI* TGetIfEntry) (
J4 y' \4 S$ V- ~+ J0 x) d PMIB_IFROW pIfRow
' |" p# ]" N) c# p);
! n- @, B1 ]. p9 d" i( e, ^6 f! S0 A* f& X9 ^! E( n4 w
5 l* K% Y* @" x2 d6 eCString translateUPnPResult(HRESULT hr);
4 j, p, k8 A7 `6 |1 k# ], RHRESULT UPnPMessage(HRESULT hr);8 _9 p4 @. X; T' G
3 f# O( n- @- _% B
9 K6 `4 d0 E& s4 j% C
class CUPnPImplWinServ: public CUPnPImpl
. k2 s5 V& l/ C) h{* R# B* @2 X. J
friend class CDeviceFinderCallback;
# G1 c/ M2 _ z9 Y, a2 S Z5 G friend class CServiceCallback;' r( N# X3 l2 A! v3 W+ ]1 d
// Construction
& S8 X( T4 T$ p( I- u' Tpublic:
( h* U# b4 B+ h& e2 j/ Y( c/ f virtual ~CUPnPImplWinServ();
8 ^$ y6 b; X4 l CUPnPImplWinServ();
7 o8 \/ m1 D" S. Y F* Y# J) z! S" ?) H9 z( l( A8 |% I
# p' C0 G% I) b3 U. Y W- T
virtual void StartDiscovery(uint16 nTCPPort, uint16 nUDPPort, uint16 nTCPWebPort) { StartDiscovery(nTCPPort, nUDPPort, nTCPWebPort, false); }7 k8 g) b$ q% p7 p' ]
virtual void StopAsyncFind();% ?/ T; ?- k- ?' q5 {
virtual void DeletePorts();
6 @& w- p" _! `6 A% @7 N virtual bool IsReady();
1 o! Z1 L4 l! K& c9 f4 l( `! B virtual int GetImplementationID() { return UPNP_IMPL_WINDOWSERVICE; }# m! R. d; i* M. U0 C6 r
. k) I' y7 F9 z
2 s! Y$ l5 C. X' x. `9 F
// No Support for Refreshing on this (fallback) implementation yet - in many cases where it would be needed (router reset etc)' N, b8 [1 h$ S+ H
// the windows side of the implementation tends to get bugged untill reboot anyway. Still might get added later9 R' }) A2 Z# c& m0 R' p
virtual bool CheckAndRefresh() { return false; };1 t/ d# G$ m7 ]% u2 s
7 L0 _9 W2 F+ x4 r+ J6 U/ _
9 q3 I* G, p& U, l |3 ]protected:* n1 n* O% k' k F, k1 v2 u( w
void StartDiscovery(uint16 nTCPPort, uint16 nUDPPort, uint16 nTCPWebPort, bool bSecondTry);
% `7 S' m7 |! M, D( | void AddDevice(DevicePointer pDevice, bool bAddChilds, int nLevel = 0);
1 Q7 S5 p0 G; f t9 n void RemoveDevice(CComBSTR bsUDN);
: i' r* x6 b7 m# n; I: T4 r* l bool OnSearchComplete();
" I8 E# a M( p. J) Z void Init();. a5 f. l5 f3 y: t$ e
S6 x% }! q3 k9 u! K0 B Q, B
7 y/ \6 }5 X9 R, ?6 K( k" T& u5 g inline bool IsAsyncFindRunning()
% i' K3 F7 P) j* ?/ N$ U {7 j0 x5 S }6 s2 b8 ?
if ( m_pDeviceFinder != NULL && m_bAsyncFindRunning && GetTickCount() - m_tLastEvent > 10000 )8 k# w% Z6 i" G
{
7 x- p- `7 `& z2 M; Y' Y/ o* b/ q m_pDeviceFinder->CancelAsyncFind( m_nAsyncFindHandle );2 x6 S' a. ^) Y
m_bAsyncFindRunning = false;, i% R0 X$ O2 U
}$ H4 ?4 h9 b. ^+ N
MSG msg;
' L5 X! J: I$ |5 @# e$ g! y3 X while ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
7 S0 t( {) m2 g" z" C {5 O |6 l0 N8 d; j' L
TranslateMessage( &msg );$ K0 N5 ?8 a8 ]' v, R
DispatchMessage( &msg );
2 F5 |& M& y0 m, l }" D3 H5 M& P! O
return m_bAsyncFindRunning;
- r% X4 P8 q K2 ~ }
% ` n ]" P0 o5 a, Y
' D9 Q; I4 N& j; f2 F! b! ?5 ^7 M0 J9 Z" X% N5 V
TRISTATE m_bUPnPDeviceConnected;
5 s6 P; j1 S2 P+ ~( Y- U7 ?8 ^6 p* ^6 n, {. O& k
( @3 y6 q! z! t4 ?" i- p8 d
// Implementation
; N& m7 c$ c1 R3 S# h) l& U // API functions
: I" w4 \! `/ R0 j SC_HANDLE (WINAPI *m_pfnOpenSCManager)(LPCTSTR, LPCTSTR, DWORD);3 ], O9 x: i0 t0 w4 Q/ I
SC_HANDLE (WINAPI *m_pfnOpenService)(SC_HANDLE, LPCTSTR, DWORD);
' u' w b: b) m- E- C! ^$ Z4 s: n BOOL (WINAPI *m_pfnQueryServiceStatusEx)(SC_HANDLE, SC_STATUS_TYPE, LPBYTE, DWORD, LPDWORD);
' o2 f6 f5 f s( U+ b BOOL (WINAPI *m_pfnCloseServiceHandle)(SC_HANDLE);6 c! p5 o5 Y7 o
BOOL (WINAPI *m_pfnStartService)(SC_HANDLE, DWORD, LPCTSTR*);
; z& F7 X2 k E0 X3 h4 f$ M& U BOOL (WINAPI *m_pfnControlService)(SC_HANDLE, DWORD, LPSERVICE_STATUS);9 a& @3 `0 B% p! d- R- F0 L' G
) W% C9 x1 @, w& u; I }
: ^, q1 Q3 x$ [% m, ~. L
TGetBestInterface m_pfGetBestInterface;0 m. @' z! ^& j& u
TGetIpAddrTable m_pfGetIpAddrTable;7 a( ~3 d ~7 {7 c. E& p
TGetIfEntry m_pfGetIfEntry;9 k% f9 E, X' F! z6 _
3 }8 d, @5 F( `9 ?1 v4 M- v
( D% \+ H" E, m9 L
static FinderPointer CreateFinderInstance();
6 ~0 \( N9 k3 L) T struct FindDevice : std::unary_function< DevicePointer, bool >+ j, b9 H3 u ^' ?) k7 M# e
{$ r, m! r n- H% {0 A
FindDevice(const CComBSTR& udn) : m_udn( udn ) {}
7 _/ Y7 t) {) c9 t* ?' t, O result_type operator()(argument_type device) const
7 P1 O$ x- a. B, F& f {7 ?* h# I" s: a0 {; }
CComBSTR deviceName;
* f3 e) \4 J/ T; ]0 L: S# T9 Z S HRESULT hr = device->get_UniqueDeviceName( &deviceName );
1 r1 J) f* m9 ~7 j( m$ K
. m- z, n4 U8 X* U7 T4 m' b. ^1 S( D" [* M+ `# d
if ( FAILED( hr ) )6 p) l1 _) Z9 ~7 x
return UPnPMessage( hr ), false;" _4 _' N& D0 |( l3 G; y/ I
2 E( D7 Z) u* ^' x! ?' N! Q' R& a# u7 c% Y5 e* c4 Q
return wcscmp( deviceName.m_str, m_udn ) == 0;
5 o2 i- p0 s' ? }/ x! T9 Y5 l8 u5 P G6 k5 |
CComBSTR m_udn;
/ ?, l1 W5 {. B& r4 w) g' y };
1 O5 ^. `2 B5 w9 h* P . M2 t) B8 }7 p' Y$ P5 L5 S
void ProcessAsyncFind(CComBSTR bsSearchType);/ a; W, V# l3 j% ^* X+ n
HRESULT GetDeviceServices(DevicePointer pDevice);3 v& P8 B( G4 k- X" N
void StartPortMapping();# \! p0 d" }# x$ L& U
HRESULT MapPort(const ServicePointer& service);
D! {" }! z E" K void DeleteExistingPortMappings(ServicePointer pService);
. [8 H5 Z+ p: G1 ]8 t void CreatePortMappings(ServicePointer pService);4 _( v# V: f5 A5 b
HRESULT SaveServices(EnumUnknownPtr pEU, const LONG nTotalItems);
) h' i7 Z K- X% c HRESULT InvokeAction(ServicePointer pService, CComBSTR action, : C1 R. x! C5 x1 [9 @6 m9 H
LPCTSTR pszInArgString, CString& strResult);
5 J+ l$ r0 b+ Y3 S; @ void StopUPnPService();7 [/ W4 z2 m: w- ]/ G5 B
! o$ v5 m( {$ }# ]' T% U# w
# ?9 H$ o. ^) `; s" R( i3 T" b // Utility functions
2 g( C4 R0 {4 m' @2 v HRESULT CreateSafeArray(const VARTYPE vt, const ULONG nArgs, SAFEARRAY** ppsa);* z o! i' B) H/ R0 c3 }
INT_PTR CreateVarFromString(const CString& strArgs, VARIANT*** pppVars);$ q( _( M$ D' e& R( U4 r. g
INT_PTR GetStringFromOutArgs(const VARIANT* pvaOutArgs, CString& strArgs);
, Z3 |" l3 W I void DestroyVars(const INT_PTR nCount, VARIANT*** pppVars);8 u# b- y. _, \: x" \. W# S* I b
HRESULT GetSafeArrayBounds(SAFEARRAY* psa, LONG* pLBound, LONG* pUBound);1 p7 b' n, A' _& ?
HRESULT GetVariantElement(SAFEARRAY* psa, LONG pos, VARIANT* pvar);
0 n, f+ E7 C, f* J CString GetLocalRoutableIP(ServicePointer pService);
* @" l7 ^% |6 |; J# K
8 z" r5 }9 S! O: |3 @3 I( A5 R6 C; t! z
// Private members% N7 h7 K. u: N3 j$ @
private:
$ k+ ^7 M' b' M! R2 M DWORD m_tLastEvent; // When the last event was received?
4 I. C! J( X. G( ^# | std::vector< DevicePointer > m_pDevices;8 @; I: Q( x0 J% {) {7 L* ^* ?
std::vector< ServicePointer > m_pServices;
! N( n9 t0 N# c# m; a FinderPointer m_pDeviceFinder;& b3 k5 J) m9 u" e5 w( p5 p; @, h2 h
DeviceFinderCallback m_pDeviceFinderCallback;
+ K: }+ v% O. b* \+ B ServiceCallback m_pServiceCallback;0 i- ]0 A' G/ A. I) g" h9 x( b, f
. r" G% p1 a, T/ ?
3 e! d8 q. v% e4 ` LONG m_nAsyncFindHandle;
* L4 {1 E3 v* P# p" D* v bool m_bCOM;
2 V. \5 w7 Q* s/ y bool m_bPortIsFree;" V4 G# e9 M3 c
CString m_sLocalIP;
2 b1 M" J. w, m2 A* X3 W' X CString m_sExternalIP;
+ z2 j: d( S) l& E' m( G# {- k bool m_bADSL; // Is the device ADSL?3 z! n ]: b6 M7 E
bool m_ADSLFailed; // Did port mapping failed for the ADSL device?- O! N- N% R# A* s
bool m_bInited;
" }# n; p& A$ x8 N8 m* r. a- f bool m_bAsyncFindRunning;& e, \5 V' ]9 I6 I8 M8 d( z
HMODULE m_hADVAPI32_DLL;
+ s4 j# e5 x4 B# q( w2 F HMODULE m_hIPHLPAPI_DLL;
+ r/ @/ F- ?; C; x! h9 o bool m_bSecondTry;( G. F5 M7 w, a0 A- o" c
bool m_bServiceStartedByEmule;
0 e3 g1 S0 V/ b7 \' l bool m_bDisableWANIPSetup;6 D2 s. x" S( Q: O
bool m_bDisableWANPPPSetup;
$ c7 y3 s" T/ g: r! c. P$ v
/ E5 k' S* I4 j/ i7 w% n3 C8 K$ ^' _5 B# \5 W% Y
};& l, w0 L5 J9 Y, ]7 D" ?; Y5 R8 l1 }$ J
) V9 ^: L4 Z+ f" ^1 j8 _1 b$ f+ P0 p3 I R- G1 n
// DeviceFinder Callback
3 ^/ f" U& F. V8 W, u4 s1 Gclass CDeviceFinderCallback/ p4 S: ]/ y% M
: public IUPnPDeviceFinderCallback; H% u. p$ F$ A% M" d
{) [" z4 {, u4 e/ e+ K8 W4 S
public:
2 H5 ~: i L" A- m8 P; Z# e CDeviceFinderCallback(CUPnPImplWinServ& instance)
6 u7 A$ C! E' V8 z : m_instance( instance )" V* F* c5 s+ R }7 a5 b
{ m_lRefCount = 0; }* A/ q; w8 T4 O, K$ L
( `. S7 X: R0 c
) [* o! t8 V. C2 u3 n' E# m' C9 ~ STDMETHODIMP QueryInterface(REFIID iid, LPVOID* ppvObject);
" t# D( A$ w, V* Z) `8 {6 Y6 K- `3 { STDMETHODIMP_(ULONG) AddRef();
/ h' f3 Y' I# A) X" ~3 i STDMETHODIMP_(ULONG) Release();
; l* ~8 ^5 Z; n$ N
' o( ^! z$ G- F6 F9 \' d. L
# o5 ~! Z" _1 C6 x. E* v" b* ]2 E// implementation: d+ q3 J3 M0 @
private:" _, g/ Z7 C2 l! A+ V
HRESULT __stdcall DeviceAdded(LONG nFindData, IUPnPDevice* pDevice);* _, P* x- l7 a7 F8 m5 \
HRESULT __stdcall DeviceRemoved(LONG nFindData, BSTR bsUDN);" z! e( k6 N4 J/ {- S
HRESULT __stdcall SearchComplete(LONG nFindData);
, }2 s% s, H. l4 t5 Y! a& k+ ^. k4 s! k" N1 I* |) v Y+ g/ G' z
* ~* Y# D+ C+ d$ N/ Z
private:) |' A& S6 {& P& ?, j k1 K
CUPnPImplWinServ& m_instance;
. H- A) o8 M# R. B- U; {, s' C4 Y LONG m_lRefCount;4 G0 Y3 f; z7 X) a; A+ y$ o: y
};$ m; h7 U- o# X$ l" ]5 x; q* `
* M; {. G# E/ @' m* E# o: g0 W" W# O
// Service Callback
1 ~1 e* }2 w1 jclass CServiceCallback A! u, c$ G( c, [
: public IUPnPServiceCallback* N: H( ~( P& x; L; l
{
; s: d7 g; G q4 Q+ W3 J: ]& _6 o. {public:
0 ]# [+ d0 x, p* P9 s5 E CServiceCallback(CUPnPImplWinServ& instance) v5 w) m3 b. g; j
: m_instance( instance )
+ p7 ~: ~0 X/ n% v; i+ ]) Y$ w { m_lRefCount = 0; }
' ~) l8 i% ]8 j* g, b & Q- w" U) N; h; b
STDMETHODIMP QueryInterface(REFIID iid, LPVOID* ppvObject); `. ^( T" b* ?0 z
STDMETHODIMP_(ULONG) AddRef();2 m+ V+ h' V% M+ }8 ^2 Q
STDMETHODIMP_(ULONG) Release();
+ J( l: c* n9 `4 P. u
& `* O0 b0 [3 }) }: ?: r. v8 G/ N9 b$ z8 J. F) ?! e+ M3 E, K) R/ J
// implementation2 p5 f% r7 Y6 \; v$ x: l
private:5 ]! e- \) A3 ]( n% w8 @$ X
HRESULT __stdcall StateVariableChanged(IUPnPService* pService, LPCWSTR pszStateVarName, VARIANT varValue);* y3 W/ }; y/ K$ ^
HRESULT __stdcall ServiceInstanceDied(IUPnPService* pService);: ~0 W0 e# Z6 Q
& U4 R9 D) v* ^- F
0 I5 J. k- D% z- J# U) P+ z0 t, @* bprivate:
, y8 O3 ^. e* l0 P CUPnPImplWinServ& m_instance;2 n3 A9 a B, `+ Y' x
LONG m_lRefCount;
) X5 _7 t4 i: p( {, Y- I' q};
8 G# z$ u) i1 a3 v/ ?8 N+ t7 f7 s+ \3 `! n/ |
& c; `( v9 B: ]7 Q
/////////////////////////////////////////////////0 A( K. k& K* V, p* d% j
! z, ~4 t( O' K, J/ ]8 o3 u
" s0 F1 w8 }2 G2 j6 Q: d使用时只需要使用抽象类的接口。
a1 s" a; u7 }: A7 g5 w$ [5 lCUPnPImpl::SetMessageOnResult设置需要接受UPNP端口映射是否成功的窗口句柄和消息ID.
2 j% s0 I& W: `& ZCUPnPImpl::StartDiscovery将开启一个异步设备查找并进行端口映射,其参数为需要映射的内网端口.
\! Z2 Y' _% g5 K' p8 wCUPnPImpl::StopAsyncFind停止设备查找.* g0 P1 y T/ A! S4 S" P! F( s
CUPnPImpl::DeletePorts删除端口映射. |
|