|
|
楼主 |
发表于 2011-7-15 17:28:52
|
显示全部楼层
以下有关upnp的接口来自emule,. N) \/ k; g" w" l( U+ J" Y% s
. Z. U9 Z0 ~ `9 |2 H# s9 f8 O9 N( O' d$ f6 ~
///////////////////////////////////////////
. M/ A+ S" g4 w3 A//upnp的抽象接口类,只需调用这些接口即可实现端口映射功能. ~/ A- y6 n( Q% P' m
) y: T& |2 \" i# G. b9 u! t% |3 {' L, c1 J( Y
#pragma once
# T# k0 b2 q7 F8 @0 p#include <exception>! v5 I. t2 y" I6 v/ r$ `
9 Z2 i3 }/ [* c+ y8 s3 F+ k& k& J" V4 q- Z$ L7 a
enum TRISTATE{: V3 e3 _& e7 A6 f. s2 u- e
TRIS_FALSE,8 e0 J# G. h. l3 F# d. H, {/ `) l+ i; i8 F
TRIS_UNKNOWN,
% H; ~- G; s& F) F4 }# H7 ~ TRIS_TRUE
* r5 N" R. c) {4 ]};
( j) ^% M" u* M" r; U0 s4 e7 [; |/ I8 Z( y
0 @% `* X( q, y* i; M
enum UPNP_IMPLEMENTATION{
. H/ G: p4 `5 P2 v' z1 b UPNP_IMPL_WINDOWSERVICE = 0,
! g3 _" D4 g, }, c/ d2 ? UPNP_IMPL_MINIUPNPLIB,
m5 S4 x0 T. Q2 W3 m& S$ i" A' F UPNP_IMPL_NONE /*last*/
! W8 f1 ~3 x" s( \- C};
0 \# Y6 c5 P! U% v) i3 @( Z
4 ^8 F' d) C4 e6 l
6 }) z! X# `4 ?2 p7 G
4 I( C! o+ q( d1 d1 t7 w0 @7 O# @3 \& I9 T
class CUPnPImpl
% j. Q3 y, [; V{
( M: D5 k) q/ W* Apublic:5 ~8 b5 ^0 k; E5 a' F/ e
CUPnPImpl();
/ p4 m" ]/ b; A+ h8 C+ P$ f virtual ~CUPnPImpl();
2 }& e0 a/ E8 j d+ a7 q struct UPnPError : std::exception {};1 H$ k# ^8 S0 P& i0 v8 |0 c5 C
enum {) P# Q( T; ~* J, e2 S
UPNP_OK,3 ~1 U# R4 Z6 V% d% L
UPNP_FAILED,7 L# J3 K2 E$ M5 Z r
UPNP_TIMEOUT
; _. v" B+ Q: x1 n! g1 c };. V2 c1 C4 o. V( n: s1 b! y
6 }, _# S/ [5 K& K5 f/ p
1 \( G5 \3 a( {1 v( n; l" j' q virtual void StartDiscovery(uint16 nTCPPort, uint16 nUDPPort, uint16 nTCPWebPort) = 0;; Q6 i1 |4 N- O* `1 i
virtual bool CheckAndRefresh() = 0;& s$ t' C. l0 ?3 H# ~
virtual void StopAsyncFind() = 0;
: n g" G) h2 `. Z$ Y$ M M virtual void DeletePorts() = 0;
5 G+ p& i, d1 _+ A, a) u$ y virtual bool IsReady() = 0;
/ y- ]0 J# _% b* N0 B) C virtual int GetImplementationID() = 0; M! e& ^# `& W$ S! Q. p* I2 J
1 @, }1 s! t$ a' g3 Z ?- y void LateEnableWebServerPort(uint16 nPort); // Add Webserverport on already installed portmapping
1 U% a7 t; O1 \" F$ P! o! A' ?) z
8 n: w/ X2 ]+ o$ u; }4 x1 ?4 b9 N4 o* D( z
void SetMessageOnResult(HWND hWindow, UINT nMessageID);
! m g6 I4 L, X$ ]- q TRISTATE ArePortsForwarded() const { return m_bUPnPPortsForwarded; }
3 w# T0 C1 Q) \& D uint16 GetUsedTCPPort() { return m_nTCPPort; }+ c- k+ X0 @2 C5 s/ d, q
uint16 GetUsedUDPPort() { return m_nUDPPort; } - K7 Q/ ~9 X" K* b7 I
: M; \8 @) i9 I0 o7 b
7 Q) h9 Z# e+ m8 M+ m! T% o
// Implementation: S: O8 k5 `4 l- C
protected:* v7 \* H3 V* Y5 _) D9 j& d
volatile TRISTATE m_bUPnPPortsForwarded;8 a8 Z" S0 C1 S, s
void SendResultMessage();- P! i$ l2 D D4 x
uint16 m_nUDPPort;
# \1 z6 U/ j7 Q B+ V5 G uint16 m_nTCPPort;6 {* d7 l8 ~/ B% ~7 }0 A. k7 z
uint16 m_nTCPWebPort;
3 r/ I8 I* [9 P2 g* u3 K& Q bool m_bCheckAndRefresh;
9 l" s" d6 n' p& R. g/ D4 j, V' x* o4 c; V. N
& D+ p) l! ], k9 |. d' ?private:: f# Z9 S9 d6 F5 a+ Q& R a: Q7 |
HWND m_hResultMessageWindow;6 o0 \7 I# B3 y0 o
UINT m_nResultMessageID;; {1 {5 C( J5 T6 b9 \
2 n1 l) d5 T8 E8 V
9 x' ^6 b0 q% j/ O% ]# [8 t};
, u# c, {6 o. I4 t4 x8 ^3 R/ _( W' m4 y
& [( \# c S7 G( T
// Dummy Implementation to be used when no other implementation is available7 P& ]9 W+ V' E" n( m4 R! G2 r9 s8 ?
class CUPnPImplNone: public CUPnPImpl
+ |3 m8 B; X$ p{
# \# W2 k9 N& I; O$ C7 z+ opublic:" j+ Y1 I5 ]1 J0 \$ i; L+ V: U
virtual void StartDiscovery(uint16, uint16, uint16) { ASSERT( false ); }
" G$ | s0 E: p' Y6 C4 j. X virtual bool CheckAndRefresh() { return false; }2 e% Y! x( @/ P g* h3 {
virtual void StopAsyncFind() { }+ V2 T" Q- \/ d" X' _" t
virtual void DeletePorts() { }
3 A0 O r, s- a# ^ r& F virtual bool IsReady() { return false; }
- Q, X/ N7 y2 A7 Q. I1 _) g# I virtual int GetImplementationID() { return UPNP_IMPL_NONE; }
5 r% ? Q' w$ m$ G9 K& { k};, u- L+ r9 j7 y d1 I! }. O
7 i" L, Z3 z v* g, ~' n, m+ Z
+ @1 i/ X( D# |% D3 v7 |/////////////////////////////////////8 V" p d9 n1 @
//下面是使用windows操作系统自带的UPNP功能的子类( ]8 v K! N( ~- }. w, K- G
5 z! T7 [; }% F4 R, R5 G
1 O* j# k# o9 c! x4 `
#pragma once
4 u4 n. N' v, k6 M' o h#pragma warning( disable: 4355 )( p" x. r2 i& N0 ~; m" \
: q5 i, m5 v& P1 @5 h- A/ N
, `, s( t' L: I#include "UPnPImpl.h"
( e& P' [/ h- O0 v c#include <upnp.h>
2 a( Q6 J" P& _ p, u4 _#include <iphlpapi.h>
' R' p* ~8 |* }' k0 d {; g#include <comdef.h>6 j; n; X! {) I3 x$ B! Z
#include <winsvc.h>
4 z7 W- ?: N; O2 ^7 t- v3 {* X4 y$ i8 T; d5 ^5 Y8 w+ o7 U% C
# ]" `- U# O5 n7 N0 {' X#include <vector> _- b* E8 F0 r; e- P
#include <exception>
3 q, b5 P4 [8 W M1 n V+ v#include <functional>
( X$ o" z% t8 q" A! g# e7 U( l9 u8 J2 g! P# K
* m0 K, g# e0 R6 t% N! N
4 |$ L9 d' n2 z% X3 U. i& Z* ?
: a! ?. K) A8 s6 S8 ~typedef _com_ptr_t<_com_IIID<IUPnPDeviceFinder,&IID_IUPnPDeviceFinder> > FinderPointer;0 D" L" d/ Y+ O r. T
typedef _com_ptr_t<_com_IIID<IUPnPDevice,&IID_IUPnPDevice> > DevicePointer;# o m% ~, F* Y. H) {- R9 n
typedef _com_ptr_t<_com_IIID<IUPnPService,&IID_IUPnPService> > ServicePointer;4 G) ~; [% `# r) t4 s3 P
typedef _com_ptr_t<_com_IIID<IUPnPDeviceFinderCallback,&IID_IUPnPDeviceFinderCallback> > DeviceFinderCallback;
2 z% I, l3 A! K% Ctypedef _com_ptr_t<_com_IIID<IUPnPServiceCallback,&IID_IUPnPServiceCallback> > ServiceCallback;
1 C7 ^0 b: c: f2 z- }" C. y+ b2 X- _typedef _com_ptr_t<_com_IIID<IEnumUnknown,&IID_IEnumUnknown> > EnumUnknownPtr;; S/ U- G4 H* P* {9 h' J
typedef _com_ptr_t<_com_IIID<IUnknown,&IID_IUnknown> > UnknownPtr;# \) P/ C" k# H% y
; P) i8 S3 G. s' K3 W( l0 e/ S* I7 V, P$ r- o
typedef DWORD (WINAPI* TGetBestInterface) (7 H8 M: ~ s) H# r2 q2 ^: v9 h
IPAddr dwDestAddr,6 O3 g" g3 Y& D- z1 v0 J
PDWORD pdwBestIfIndex1 f8 V9 O5 `2 D' q% T1 G5 ?
);, H8 u& f2 i3 y6 ]
' a( g/ Z' V5 O
4 O8 Q$ a- ~+ ], T( |6 [; Ztypedef DWORD (WINAPI* TGetIpAddrTable) (
# W- g3 a& t7 d @; `0 o PMIB_IPADDRTABLE pIpAddrTable,
" ~8 ?$ G* u# B% a% n! C PULONG pdwSize,- U, t% j: o9 c1 I% o0 ^. E
BOOL bOrder
, h+ j8 C' D+ \* j# f$ }); ]# s+ m- W' l' V: j+ N8 X
, R1 H, s3 V( D% H' g+ s# o5 y2 {" E. `+ e5 H- h
typedef DWORD (WINAPI* TGetIfEntry) (
& f2 o; l% @" r( W) J3 F, Q PMIB_IFROW pIfRow7 A+ U v# v e3 M$ W
);# u# V7 H( Y2 e. P
H9 @; O7 v! [6 S. U
, T( }% j+ W$ I: {6 [, Y; dCString translateUPnPResult(HRESULT hr);+ Y2 B& }/ q/ q" o+ K. F
HRESULT UPnPMessage(HRESULT hr);$ x& T$ H7 w; q- c
+ D( E6 ]7 A2 Z6 A2 _- |+ c4 [ K! g+ U+ `& g
class CUPnPImplWinServ: public CUPnPImpl
! L; ^4 L$ i2 P: s/ e) f8 g{
5 L b6 L- J1 [! H, H6 p. M5 X friend class CDeviceFinderCallback;4 n* N. G- r6 k$ v6 _6 h
friend class CServiceCallback;
# L* y1 S4 |9 I2 A( T( m// Construction
+ T+ {: U% i$ Tpublic:( H' l [( w+ z* u+ e
virtual ~CUPnPImplWinServ();
& q$ d3 T5 @( |1 G7 b+ W CUPnPImplWinServ();
( v0 G; O$ _" ` W+ O$ [$ }' ~6 m1 N/ Z
* }0 o' O4 p4 P b9 |6 p
virtual void StartDiscovery(uint16 nTCPPort, uint16 nUDPPort, uint16 nTCPWebPort) { StartDiscovery(nTCPPort, nUDPPort, nTCPWebPort, false); }
! F, Z( U; v4 n2 T! K; M. }. |+ N virtual void StopAsyncFind();
: k; M) s% Y. N: u virtual void DeletePorts();3 o3 m/ u, n2 [! S7 |/ p
virtual bool IsReady();# |2 K+ k& S7 e8 f
virtual int GetImplementationID() { return UPNP_IMPL_WINDOWSERVICE; }
$ ~( J1 c0 U; g5 ?0 ~( S% Y. |" _
7 T. m. S: a! r3 E7 o& `1 ~+ N
; W: j# }* m0 u2 I" ?* k // No Support for Refreshing on this (fallback) implementation yet - in many cases where it would be needed (router reset etc)
& X( k7 b# {# O1 O8 m; ` // the windows side of the implementation tends to get bugged untill reboot anyway. Still might get added later
8 X" L5 k" l' z7 q* T# g G virtual bool CheckAndRefresh() { return false; };
8 T/ \4 _* j6 w' K' `7 }
5 T/ l( e4 [, ?+ S" f7 a0 v; @0 b7 \% J. N. a
protected:
3 ~6 M1 o, N; M' G( @) \ M void StartDiscovery(uint16 nTCPPort, uint16 nUDPPort, uint16 nTCPWebPort, bool bSecondTry);
" z1 J1 K0 b4 D: G2 Z7 Y void AddDevice(DevicePointer pDevice, bool bAddChilds, int nLevel = 0);8 \% i! i1 z+ t* }' I6 T0 }2 x: N
void RemoveDevice(CComBSTR bsUDN);
" i8 S' U7 W1 o bool OnSearchComplete();
" B6 o) {! C* T$ I6 Q9 C6 D void Init();2 g% e8 @; u. R7 S& e; v% K5 e
' F' `% E: m6 C E B( f- R
7 x K! r# o# N% g5 I# I* i
inline bool IsAsyncFindRunning() * I! S/ S2 v; x" {. ]
{
3 ~% L# X6 I. T& d if ( m_pDeviceFinder != NULL && m_bAsyncFindRunning && GetTickCount() - m_tLastEvent > 10000 )& K* s; ?- u6 A! u% ] M
{
+ H: `1 B/ l: R m_pDeviceFinder->CancelAsyncFind( m_nAsyncFindHandle );5 {# t: H* l; ]/ J
m_bAsyncFindRunning = false;
3 A7 J! f# I0 Y, O& H: a5 r }& Q7 w- f# ?* g% @% \- V7 m
MSG msg;$ k0 K S8 ?# Z4 k: y( a7 y
while ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )2 ]! ]9 U) C( H% b
{
. M0 j) ], m( d) M+ ] TranslateMessage( &msg );! v% z, @; M: m! M. e" v& z4 d
DispatchMessage( &msg );
! S* ` k0 E. u3 f! M! R6 R }+ G) \' Q+ a- v# K$ E
return m_bAsyncFindRunning;
4 |, V6 d' t* R- x9 p% F1 D+ S }+ i0 c: k* R$ y
. y5 R* F# U' Z' N5 s! Q/ y' M9 l
9 }* X8 S% a9 s1 M; M TRISTATE m_bUPnPDeviceConnected;) g0 g2 x, Z) N8 S$ i+ ]$ V7 Y
& ]# N1 A+ y* V' P
7 J& F" G3 F- Z$ C6 }// Implementation3 b/ z1 B4 H" d6 D% v Y
// API functions5 s6 }/ Z7 ~& C" N0 u) [# |) f' c! J" D
SC_HANDLE (WINAPI *m_pfnOpenSCManager)(LPCTSTR, LPCTSTR, DWORD); H/ ?# W3 x" W5 L
SC_HANDLE (WINAPI *m_pfnOpenService)(SC_HANDLE, LPCTSTR, DWORD);$ p5 e& z2 g( O1 I1 R& `
BOOL (WINAPI *m_pfnQueryServiceStatusEx)(SC_HANDLE, SC_STATUS_TYPE, LPBYTE, DWORD, LPDWORD);8 p8 X1 t8 M3 w& N* N" ~
BOOL (WINAPI *m_pfnCloseServiceHandle)(SC_HANDLE);. \0 X7 g( Y9 y, {1 y
BOOL (WINAPI *m_pfnStartService)(SC_HANDLE, DWORD, LPCTSTR*);0 }1 j% K: _ p. b7 z# X
BOOL (WINAPI *m_pfnControlService)(SC_HANDLE, DWORD, LPSERVICE_STATUS);
% W: m1 b- ~' J9 h2 ~
) M. H# ^2 P3 {! {5 S; c/ y0 x/ k: X8 x
TGetBestInterface m_pfGetBestInterface;. u" U5 y2 j9 D9 H8 g
TGetIpAddrTable m_pfGetIpAddrTable;
0 {. r% N- Z; Q; x8 J& m- R TGetIfEntry m_pfGetIfEntry;+ N# g9 ~/ {0 F. c+ C% |$ ~2 }
( ~, \- j' k$ S2 K
1 q* Z9 p! l1 t, N) ?
static FinderPointer CreateFinderInstance();: u+ A+ u" e: o3 Q
struct FindDevice : std::unary_function< DevicePointer, bool >
& f( i: `- o4 S B/ ?6 X0 C! q {
% l( \1 [: `" O5 }1 J" T, c8 X FindDevice(const CComBSTR& udn) : m_udn( udn ) {}6 ]! g! c3 r/ p
result_type operator()(argument_type device) const$ x4 l* K; p" ]+ m% `9 I
{% A! \/ P% D' ~" [6 x+ w
CComBSTR deviceName;8 P, f/ H3 y. v" c
HRESULT hr = device->get_UniqueDeviceName( &deviceName );' x# V9 v. h' Z2 F5 L9 r0 W
- b; s( X! u& l @: j+ ]8 g
. v! n1 I' m* R: T if ( FAILED( hr ) )
* e, b' U: O; b return UPnPMessage( hr ), false;9 T2 m; S6 H6 B6 u. @/ J- ^+ Q0 a a
! x; y3 I' @: j2 t* E7 N p' G
; ^% p' E- g7 V& e5 o
return wcscmp( deviceName.m_str, m_udn ) == 0;6 H0 [- i& m. g: A4 K! ]) a
}3 U8 i) U8 M$ Q0 _
CComBSTR m_udn;
* [ Q5 r1 G& Z$ X& `9 Q6 V };2 ^- Q8 v& a+ B
- F1 E/ l# z5 [0 v4 P3 \" ? void ProcessAsyncFind(CComBSTR bsSearchType);, [$ F1 y3 Q* C M; U, T2 t
HRESULT GetDeviceServices(DevicePointer pDevice);
& S, V b: I1 O# d void StartPortMapping();3 o/ c6 l- J* G- c8 o
HRESULT MapPort(const ServicePointer& service);
4 |* P- R9 e" M$ z5 _9 B% x void DeleteExistingPortMappings(ServicePointer pService);* _" N' N8 s* V" O. |
void CreatePortMappings(ServicePointer pService);
/ U5 ~$ A* u8 k2 Y; e g3 Z- ^ HRESULT SaveServices(EnumUnknownPtr pEU, const LONG nTotalItems);% C* ?# |, g0 ^9 m
HRESULT InvokeAction(ServicePointer pService, CComBSTR action,
* X' F/ M i' F0 a2 i2 @4 m: e LPCTSTR pszInArgString, CString& strResult);
, e+ p) [' S: N2 h( _# F void StopUPnPService();4 p u0 L v4 @% `9 n
n9 ]* S0 }0 F" H* J ^; b9 R
3 T: e/ P. y' T6 U6 v$ y* r // Utility functions7 X- s8 t; U; ^: a- y% `1 r, I
HRESULT CreateSafeArray(const VARTYPE vt, const ULONG nArgs, SAFEARRAY** ppsa);
' t+ H5 S$ X8 f+ D5 Z' p INT_PTR CreateVarFromString(const CString& strArgs, VARIANT*** pppVars);7 v6 f( ]2 G6 j+ k9 ^! n- [3 b, W7 l
INT_PTR GetStringFromOutArgs(const VARIANT* pvaOutArgs, CString& strArgs);
( p- _( ^" h8 y2 ^* w void DestroyVars(const INT_PTR nCount, VARIANT*** pppVars);
+ U) Z0 g' ^5 P1 @+ u; n# X HRESULT GetSafeArrayBounds(SAFEARRAY* psa, LONG* pLBound, LONG* pUBound);) Y1 b+ J( @/ u. @1 L$ b6 G
HRESULT GetVariantElement(SAFEARRAY* psa, LONG pos, VARIANT* pvar);2 R7 M. y |6 D, v# X/ S/ x
CString GetLocalRoutableIP(ServicePointer pService);
& w7 m0 d8 L# i6 G
& C, a. b5 h3 c/ |3 O6 a( ^* {5 ?" b/ J' y$ R
// Private members" m, l% x2 r2 }5 k
private:
( `1 _. \, X) d* k DWORD m_tLastEvent; // When the last event was received?
9 }2 `0 d( k4 B$ h# ^ std::vector< DevicePointer > m_pDevices;- J. W3 L# J+ L* k# w6 y9 v
std::vector< ServicePointer > m_pServices;9 V# R1 V" n$ q6 D U! |' x
FinderPointer m_pDeviceFinder;
4 o) f, g& T1 ^8 z5 q, m6 e; E: j DeviceFinderCallback m_pDeviceFinderCallback;, ?% H4 V3 ?! S1 \ N! c
ServiceCallback m_pServiceCallback;/ D, r' E# y8 T! }
+ g# a0 S0 x! a A/ `8 O
9 k% }% Y; P- j* {/ ?4 K( `
LONG m_nAsyncFindHandle;3 j$ o( _* h/ ?! ~/ H% r( {* a
bool m_bCOM;
8 A( j$ r9 n3 x bool m_bPortIsFree;
' Z: z x; J7 q CString m_sLocalIP;: N) K9 F# [: N" g5 L% l, e- Y: q
CString m_sExternalIP;
% \7 i4 r+ z7 W" D0 j. e bool m_bADSL; // Is the device ADSL?. _0 K7 d# z/ s5 Q# g9 }9 j5 Y+ ~
bool m_ADSLFailed; // Did port mapping failed for the ADSL device?
0 z" _- F8 s. g: h bool m_bInited;+ A. W7 A3 U* m4 a) |! Y
bool m_bAsyncFindRunning;+ |' ?. _( F, Q* d3 _2 r! e( S0 u
HMODULE m_hADVAPI32_DLL;7 d! O1 ^" x8 G4 q% k/ K
HMODULE m_hIPHLPAPI_DLL;
5 Q' s: ` P0 u% R$ a' Y6 b bool m_bSecondTry;0 h4 W* K G2 L+ C% r _
bool m_bServiceStartedByEmule;
# ~" k7 ?" S) I( O9 A: p, e. u4 D* S0 g5 J bool m_bDisableWANIPSetup;
" U6 P7 Y- Z6 J) r% z9 z2 v8 n. R bool m_bDisableWANPPPSetup;1 c% l9 c& L2 d: X
4 }) l# {7 p$ s
! J& E! p9 ^3 J8 [! o& X};
. u6 F- a0 [! G) y, b8 ?* T( S5 ]0 f0 s, ?. w; h
) z: F( {# n! T8 B// DeviceFinder Callback% d! D. e+ R6 \5 `* t9 _' a/ c
class CDeviceFinderCallback
+ Q# S1 D/ B0 Q) r1 L : public IUPnPDeviceFinderCallback
F' q6 ~/ x! `+ F& q( U' r2 Z, {" V{) O, |" \" |) y9 ~5 K8 g
public:
( W% e8 F8 ~2 P5 [& G CDeviceFinderCallback(CUPnPImplWinServ& instance)0 e# Q( O% { P" ?* O# |: S* I
: m_instance( instance )# N" I) K% D: W2 V5 E
{ m_lRefCount = 0; }
5 M7 s& e o, @7 g' b" ?
# ?' o0 d( d$ o8 R. ?' Q4 ?# ~9 O& }$ ]' ?" e
STDMETHODIMP QueryInterface(REFIID iid, LPVOID* ppvObject);" I6 q4 \+ D% Q9 b# \3 y
STDMETHODIMP_(ULONG) AddRef();% s9 g+ {& u$ y* P' e3 E$ E8 r0 J
STDMETHODIMP_(ULONG) Release();
+ H6 }2 A0 u3 i1 d9 Z- g! P+ g' R* G/ g3 C8 n! p- E3 n! h
! n J- ]" i7 m. I7 a// implementation
( Y5 s" b. Z/ I6 Jprivate:
. L! w2 ^% Y. o8 P9 C7 N HRESULT __stdcall DeviceAdded(LONG nFindData, IUPnPDevice* pDevice);
9 _" Q/ d! U& K. i/ ]3 C+ N HRESULT __stdcall DeviceRemoved(LONG nFindData, BSTR bsUDN);1 |3 b/ w: n- ]' a8 f
HRESULT __stdcall SearchComplete(LONG nFindData);
4 Y3 `6 ?% H! A$ M: |& `& [: `2 @( j- S4 m m1 K
' Y6 L( _4 H9 ~& M' C
private:) r. e' _3 I: l- P
CUPnPImplWinServ& m_instance;# X V$ j1 C( x9 y5 F% T
LONG m_lRefCount;
7 V2 e0 n9 A o% c2 f( M+ j};0 [9 b$ P/ T+ s: T9 S; v
/ P2 d0 X# K8 ^6 z
/ s) e6 W& q5 d: W* _ H% m// Service Callback
, D' q4 \' ^( l6 Q9 |; ~2 @class CServiceCallback
/ U W6 e1 W+ o. E' J# M3 s : public IUPnPServiceCallback8 h0 ~' z9 V2 x
{
) T; @( u) w# i$ f+ }" N* e9 Rpublic:3 z/ P; ?% h3 I5 Y* G
CServiceCallback(CUPnPImplWinServ& instance)! f3 @ x1 m$ \" t3 w8 q* _
: m_instance( instance )
! M9 B" o9 |3 L$ Y% C { m_lRefCount = 0; }
2 l+ m) d1 Z& r& }$ s) e" h5 g 8 J0 F* F# u! m& b4 a0 H6 g. m
STDMETHODIMP QueryInterface(REFIID iid, LPVOID* ppvObject);
! ~& X/ S+ B" X! ?; u z STDMETHODIMP_(ULONG) AddRef();
: Z8 Q) v4 V \, Q STDMETHODIMP_(ULONG) Release();0 d4 L# l- }2 a5 S0 e) f
: \2 ^2 j8 W0 R/ G. ]0 P' Y
: k7 K0 R' e; t$ f2 {
// implementation' r- W# A' H" P( t; {7 v4 ~7 E! z: x
private:
$ E G; G; ?, ?6 m" q" V8 | HRESULT __stdcall StateVariableChanged(IUPnPService* pService, LPCWSTR pszStateVarName, VARIANT varValue);' ^- h7 A; H" q& b' {+ W
HRESULT __stdcall ServiceInstanceDied(IUPnPService* pService);( @; V6 I1 u3 J, Q! z
6 j% ?0 M" [. s2 N; p* g. |
+ n4 z& r2 M& I. D% L `. Lprivate:3 d& k& T0 G" _5 s! H& o% D6 n! P
CUPnPImplWinServ& m_instance;
5 E' @9 C7 A5 O LONG m_lRefCount;
6 h2 A) ]- `; O' ]% N# N0 P};
+ O- L' I6 S% G7 X( J b9 m
+ a& p% b* S+ Q2 {
; i$ k6 t3 z7 b$ F: g" f- Y/////////////////////////////////////////////////+ c' m5 y# l: F8 f# x; h
9 M' P+ G" G3 i+ i! |
7 I6 r i! t# P% i" }使用时只需要使用抽象类的接口。
0 d- L8 U' C$ a: f3 [CUPnPImpl::SetMessageOnResult设置需要接受UPNP端口映射是否成功的窗口句柄和消息ID.5 _% S% v# w6 Y( d) N T
CUPnPImpl::StartDiscovery将开启一个异步设备查找并进行端口映射,其参数为需要映射的内网端口." z5 h/ `) L! a( ^2 D4 a- t# C3 G
CUPnPImpl::StopAsyncFind停止设备查找.
* u0 o/ }3 o9 OCUPnPImpl::DeletePorts删除端口映射. |
|