|
|
楼主 |
发表于 2011-7-15 17:28:52
|
显示全部楼层
以下有关upnp的接口来自emule,! t% G' }2 b9 A) F' @2 P
$ s. A7 f8 |' Q7 G3 J% p# s7 S
5 m5 r5 P5 F# n- d
///////////////////////////////////////////
% t2 L" @( K5 H9 c4 B. d2 q//upnp的抽象接口类,只需调用这些接口即可实现端口映射功能.
9 x! f5 @' }5 ~) T8 k# v) ~' y$ a! r9 X* a( l6 n7 C: O
3 }4 J. x; v4 W6 X#pragma once+ M4 _% t ]6 ?, L+ ?& ~
#include <exception>
. p4 O3 ~! U D3 W6 F! Z# i
5 {7 u' k7 i9 F3 P0 _; J% Q/ l" A* a( [( c0 W1 f
enum TRISTATE{
8 E3 A1 I* v/ V6 u2 X, x TRIS_FALSE,+ h, s( g& O) f! V$ D
TRIS_UNKNOWN,! Y7 L% ]6 d6 ]( g
TRIS_TRUE! F$ [+ o% }; I) S% }9 G9 r
};
/ e0 O- i' S6 h5 y
: K6 J6 l5 h2 M4 g: d0 v' M$ \; `( `$ ?: D. ` a7 l( j* Q
enum UPNP_IMPLEMENTATION{6 f& Q$ D. [5 P
UPNP_IMPL_WINDOWSERVICE = 0,6 V+ `7 x8 I( b; T& ~% f
UPNP_IMPL_MINIUPNPLIB,
2 a$ Y: _7 j5 W$ z$ s UPNP_IMPL_NONE /*last*/
% _* H( }: [1 _- O};
) j. T) I2 h* Z. F7 }6 p- F, S1 E6 a
8 D8 \$ y/ u0 @5 n& G9 H
. i0 \2 R% n5 e! r9 }9 A! h
. H( ]% L4 S' ] [4 eclass CUPnPImpl
& V% ]2 r! c8 b8 @0 F{
4 R' B0 b( ]$ h( \/ ~: \' }public:
$ F% v4 M, Q& Z% L CUPnPImpl();
: R& j/ F0 Z$ a virtual ~CUPnPImpl();* z) b! h! Z, U, c. t6 ~
struct UPnPError : std::exception {};
2 P. W7 P- R, b# V( T3 ? enum {! L# B3 q0 b2 G6 n3 l
UPNP_OK,. @+ ^3 i, T- v& G) S2 t
UPNP_FAILED,/ ~, M: A4 o* {+ J5 F2 {
UPNP_TIMEOUT
2 D' y( W: n, b7 [- N& L8 v* X };
+ j6 `# I, p6 z+ {
. Z. ?& @$ |& P" [: @: C" b: s o; Z4 I: h3 L6 E3 ~/ S# i" `
virtual void StartDiscovery(uint16 nTCPPort, uint16 nUDPPort, uint16 nTCPWebPort) = 0;3 H9 [! n1 O p7 g, j
virtual bool CheckAndRefresh() = 0;
4 }% v& X7 K; {! I+ N! x: s virtual void StopAsyncFind() = 0;0 \' L. p5 D5 {6 ]
virtual void DeletePorts() = 0;
, N2 F( v7 h. u virtual bool IsReady() = 0;- \1 f. `+ M+ b! d
virtual int GetImplementationID() = 0;
+ ^6 @* m% ]: D; k4 J
3 f- f+ o# S* f void LateEnableWebServerPort(uint16 nPort); // Add Webserverport on already installed portmapping
) T" w. C; ]9 J& _6 I
5 g, |2 `- z1 C; J3 ~9 w' Q7 }4 B
, u( m) l U# R# K" y/ E void SetMessageOnResult(HWND hWindow, UINT nMessageID);' a, y2 |3 Q. D$ c
TRISTATE ArePortsForwarded() const { return m_bUPnPPortsForwarded; }! ]! ^ t/ H3 A. ~: R8 s* m
uint16 GetUsedTCPPort() { return m_nTCPPort; }1 ~- n, i" u3 I, x' k
uint16 GetUsedUDPPort() { return m_nUDPPort; }
2 B! K- i8 A% a# r6 |+ K v" R( \7 a- Z! k
. l9 C' \) k' X4 N( |// Implementation
* u% L. Q% B$ b4 aprotected:; U9 j' F& n8 T v: O! X
volatile TRISTATE m_bUPnPPortsForwarded;: H" d3 h& ^0 n9 u; ]# X0 R! x B: D
void SendResultMessage();
' f! f) z( a: n* V7 z2 |$ N uint16 m_nUDPPort;3 B8 F. n8 z- u! n+ V+ {
uint16 m_nTCPPort;
9 V) h' u4 L4 f2 Z( m6 c& e: W uint16 m_nTCPWebPort;
; x' e' m$ l9 q# b$ V* K bool m_bCheckAndRefresh;* n2 M7 |$ P; {- P! U7 g
% f' Z# t# I. e ]9 Q+ V- Y
. j1 Z( Y0 W; R! D- ~private:/ t8 D2 o* x7 s M H# F
HWND m_hResultMessageWindow;4 R" y7 n0 z, c! F1 }1 y
UINT m_nResultMessageID;
3 z3 \: L* T% Z% ]* y# A ?' }" i0 A1 P
2 y( T, _- `+ p; ~' W
};1 J( X: t' ~+ [6 M: B5 t$ E ?
6 R5 M! F* n# E- p5 s& T
- ^6 j) v- C+ y6 W8 X7 F4 y) j( ?// Dummy Implementation to be used when no other implementation is available
3 R" J0 F9 z' A" h; gclass CUPnPImplNone: public CUPnPImpl0 }4 ?8 v! B! s
{
3 w& k( J' ^- z+ N* hpublic:7 y# ~8 A l7 \
virtual void StartDiscovery(uint16, uint16, uint16) { ASSERT( false ); }
! \9 Y: R: D) P% _- V2 v+ n virtual bool CheckAndRefresh() { return false; }! c2 S) M4 `! ]$ @ Q8 r3 U% J
virtual void StopAsyncFind() { }
" N6 _- s" |& L1 G# u3 u virtual void DeletePorts() { }
6 @, L+ o7 v3 _, C4 y! ` virtual bool IsReady() { return false; }
4 T g% `2 R2 {! _ virtual int GetImplementationID() { return UPNP_IMPL_NONE; }
o0 P W2 U# v6 Z6 j) z0 ~};: g( M, ~5 ~6 _: F) J
8 P8 {! B: t' S$ v0 g% h3 z2 h
, `& M5 V+ |* O Q2 N* {
/////////////////////////////////////
6 P; x, J6 O4 c. c7 q8 h' g( t4 F//下面是使用windows操作系统自带的UPNP功能的子类( ]/ Q6 B1 n/ [ j% S2 C2 i1 [
; D% H) O5 J' G) S
1 k7 [; ?9 i& l8 @4 ]9 R& _9 D#pragma once4 ^) D7 V. Z9 |% L
#pragma warning( disable: 4355 )
" n$ s5 }, ?& G
2 Z( a% o7 Y& y- Q) J1 c: {8 [$ T, T% i L3 q$ Q+ t% L9 q, p
#include "UPnPImpl.h"
* y2 E3 p6 x6 m8 J: i0 |#include <upnp.h>- @4 F- _& P: w4 W. X7 s" z
#include <iphlpapi.h>4 ~5 E& `9 Y. J3 I1 ^
#include <comdef.h>+ M! K5 r$ \' N4 _! z% N. f, g
#include <winsvc.h>
) }" c' h) S9 o4 v9 K; P& z7 x
( ^" t/ `; l; X& c
1 m/ y$ t6 f* q2 O# r4 o3 i: ?! J#include <vector>% Q7 `) e9 x7 n% m8 x2 e: R
#include <exception>
5 O0 y* ?* C5 W" c#include <functional>
6 j& X6 ?7 \; K9 |, D' f7 s+ `# S( v+ j8 ] f
: b( L5 Y3 P0 W; s
* ~4 r+ k4 v! M( k
8 {1 u2 W5 Z4 a5 _6 r# [typedef _com_ptr_t<_com_IIID<IUPnPDeviceFinder,&IID_IUPnPDeviceFinder> > FinderPointer;. f4 a( T. C! k" U! }, F1 B- p! p
typedef _com_ptr_t<_com_IIID<IUPnPDevice,&IID_IUPnPDevice> > DevicePointer;/ H. l: J( L/ Q, v5 ~: {
typedef _com_ptr_t<_com_IIID<IUPnPService,&IID_IUPnPService> > ServicePointer;
/ X7 h: }6 |9 {typedef _com_ptr_t<_com_IIID<IUPnPDeviceFinderCallback,&IID_IUPnPDeviceFinderCallback> > DeviceFinderCallback;( C Y6 M \) ^; A: A% c
typedef _com_ptr_t<_com_IIID<IUPnPServiceCallback,&IID_IUPnPServiceCallback> > ServiceCallback;
9 S& a0 J6 i6 e' r, v$ htypedef _com_ptr_t<_com_IIID<IEnumUnknown,&IID_IEnumUnknown> > EnumUnknownPtr;4 j+ |2 {+ X1 {/ L
typedef _com_ptr_t<_com_IIID<IUnknown,&IID_IUnknown> > UnknownPtr;
8 p- C8 R& {3 E1 F0 B% y
3 v- w+ L% \$ F: v( A- {* q3 y0 [$ _) E6 A2 N
typedef DWORD (WINAPI* TGetBestInterface) (
4 ?$ J \) c% g2 @; d+ A) | IPAddr dwDestAddr,
6 @- C8 w7 C! Y PDWORD pdwBestIfIndex0 z: d/ b& ]" B
);
, j3 ]7 B, @% C6 ]2 F) e' g3 x2 b6 N/ |% a1 q' g& G( F
) Z6 g4 {5 K4 p2 jtypedef DWORD (WINAPI* TGetIpAddrTable) (! d* n0 [# y9 z( o7 b
PMIB_IPADDRTABLE pIpAddrTable,0 g: D, j. D2 [- `. a
PULONG pdwSize,
: `9 x4 H5 M+ w8 r BOOL bOrder9 c% F& x- r' Q% f* T6 E
);
2 k+ Q3 J" n4 P: F+ [
! H! {* x- p+ s8 I9 ^- h
3 F3 E2 |& }9 l! T/ q H; A4 S5 n# y% ztypedef DWORD (WINAPI* TGetIfEntry) (
& v. o* }1 ^6 `+ v9 a* c; ` PMIB_IFROW pIfRow+ _+ Z+ q. B7 w+ k1 P8 \* l
);" t3 A% Q, i @/ f
, }: \* Q* B5 ]: O. Y# A8 f. t C
# N: Y. _, E9 n4 QCString translateUPnPResult(HRESULT hr);0 O7 n [: @: Y- u1 Z1 N
HRESULT UPnPMessage(HRESULT hr);
6 ?6 w% U$ J+ |1 j$ ?. r9 s7 |
# _1 [3 s8 v1 h' D4 x3 o( }
! Y1 I- |- ^7 }9 g' yclass CUPnPImplWinServ: public CUPnPImpl4 B* {" F8 L- K$ g2 q: M2 A
{. c8 S G3 P o8 J( @
friend class CDeviceFinderCallback;
9 F, E) I) U1 Q* D) P% K friend class CServiceCallback;
3 k7 }4 q$ H: [* Z* g, T$ p6 |1 E// Construction
( I4 c2 d( \8 \, \ o4 V( P0 ]. Lpublic:
, `* x, s# ?' u7 U% e8 h virtual ~CUPnPImplWinServ();
) w, C7 L8 U1 ~$ ? CUPnPImplWinServ();
8 h; d0 \: @# T/ h1 [* l, i7 Y- I
8 n8 U" O1 V/ d
; P& a4 E; h* K7 d9 e virtual void StartDiscovery(uint16 nTCPPort, uint16 nUDPPort, uint16 nTCPWebPort) { StartDiscovery(nTCPPort, nUDPPort, nTCPWebPort, false); }
. d. N% n% n9 w+ z/ w9 @ virtual void StopAsyncFind();
% Y" S6 I3 q" x; J; W" q( y# @$ u virtual void DeletePorts();
; D! t7 K3 P/ Q; V8 q; `7 y6 R% T; V virtual bool IsReady();
# G2 }5 L' _" h& K7 Q ^ virtual int GetImplementationID() { return UPNP_IMPL_WINDOWSERVICE; }
9 z/ p3 ]! J+ d, c
, T6 H G. l) H3 {& K0 @1 o5 I3 s9 y
// No Support for Refreshing on this (fallback) implementation yet - in many cases where it would be needed (router reset etc): _. Z w" J; f2 H! O( U' ? F% C: \8 U
// the windows side of the implementation tends to get bugged untill reboot anyway. Still might get added later
S- M! o. R& x& |1 X- p virtual bool CheckAndRefresh() { return false; };
6 e) c. Q% W, j9 L* c
0 q0 O" w! w' g" S$ w/ n3 a& ]2 G$ I7 ]( M2 C) H. A; d. t
protected:* C+ X5 p3 W- r; v7 a
void StartDiscovery(uint16 nTCPPort, uint16 nUDPPort, uint16 nTCPWebPort, bool bSecondTry); x* W1 D1 H/ J/ L
void AddDevice(DevicePointer pDevice, bool bAddChilds, int nLevel = 0);7 l a$ X5 B0 |* \8 B0 F6 x$ q
void RemoveDevice(CComBSTR bsUDN);" l" I9 F% V# O
bool OnSearchComplete();
* q9 ~( U$ r6 l void Init();, R `# Q& y& _( ^. A
3 b1 Y- [; j' t" l
# A) \6 _: S" M) J( x/ I/ n1 s inline bool IsAsyncFindRunning() - t0 f4 v$ h& k: }, s$ `
{
- M. y7 z9 R# q* b; ~4 w* V if ( m_pDeviceFinder != NULL && m_bAsyncFindRunning && GetTickCount() - m_tLastEvent > 10000 )
7 \/ T# {! x1 P, ^& i; } {
# O9 ?# L! B5 v9 s0 L( y/ \% @2 w m_pDeviceFinder->CancelAsyncFind( m_nAsyncFindHandle );# d H0 r# H, h+ S' P0 W
m_bAsyncFindRunning = false;3 Z& W: ] u9 F
}6 a3 z7 z. g$ W3 I4 m1 }
MSG msg;- }- t X2 P+ U* N* w9 q
while ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
. o: m3 v% V. \& y* ~& f {
5 ?& {& b, e; V0 y* ^ ^9 w8 w4 L; [ TranslateMessage( &msg );) f+ K! P& _' V% A
DispatchMessage( &msg );* W/ r$ c+ ~- V% Q; ]+ T
}0 D. Y, S2 V; N$ T* D) g3 k
return m_bAsyncFindRunning;2 d/ s1 `. s) N1 o7 Y p
}
5 u, c1 `, |; ]
! h- r- I- _ Z6 U% T% Y, B5 B
, m# d- L/ E n& B. P$ C TRISTATE m_bUPnPDeviceConnected;
T, s& v: O( O* Z9 c# b$ C
3 v% M- _; U! ]0 F& X6 e8 B( l" H3 E" [* A6 h# G
// Implementation& m6 C- r& @$ L( x- u) ]
// API functions
0 ^/ z8 `2 o o$ o9 z9 o5 e" q) z u SC_HANDLE (WINAPI *m_pfnOpenSCManager)(LPCTSTR, LPCTSTR, DWORD);. [5 z; U& Q) J) j2 x, ]
SC_HANDLE (WINAPI *m_pfnOpenService)(SC_HANDLE, LPCTSTR, DWORD);
8 C/ G; G3 I- Y( y( y BOOL (WINAPI *m_pfnQueryServiceStatusEx)(SC_HANDLE, SC_STATUS_TYPE, LPBYTE, DWORD, LPDWORD);: j: J/ A: a3 a! Z. Q) E
BOOL (WINAPI *m_pfnCloseServiceHandle)(SC_HANDLE);6 x; P4 f. C- c+ t; \# H0 z
BOOL (WINAPI *m_pfnStartService)(SC_HANDLE, DWORD, LPCTSTR*);$ B g: ]9 m8 Y! G4 U' x
BOOL (WINAPI *m_pfnControlService)(SC_HANDLE, DWORD, LPSERVICE_STATUS);
" H; k2 l6 |7 |6 K2 I
7 c: n; z- u! _/ {8 |& E, x
# w( Q7 _$ u, @ TGetBestInterface m_pfGetBestInterface; k& S# r: _5 [. h: {/ o
TGetIpAddrTable m_pfGetIpAddrTable;
1 B0 h& t1 g+ e$ z2 T9 \* y TGetIfEntry m_pfGetIfEntry;2 I8 I6 M; p, O5 a
: \+ x% f1 S n `$ g1 X1 M2 C0 S6 x/ ?4 j
static FinderPointer CreateFinderInstance();* {( m3 p5 c! M7 n( E& f' S7 m
struct FindDevice : std::unary_function< DevicePointer, bool >+ b9 A O1 Y' _. P
{
- z# U; Q2 o5 x/ r1 x( h+ W. _6 C6 k A FindDevice(const CComBSTR& udn) : m_udn( udn ) {}- q$ d) Y# d2 \5 l
result_type operator()(argument_type device) const% E: a0 n; L" p
{7 f1 e* W' m4 B" T
CComBSTR deviceName;$ u) E, ^; E" K8 l) n7 `- m4 G
HRESULT hr = device->get_UniqueDeviceName( &deviceName );$ H% A! G7 M. d- {: O3 d0 d. |- M
7 d1 W/ a3 p& E" z; p% U
" m5 w: t$ i) S
if ( FAILED( hr ) )
0 @) b7 m4 s1 u4 u4 a* V! c- I return UPnPMessage( hr ), false;! ?8 U) X4 ], t+ C! K+ Q6 K: b
( w- F0 R8 g# m4 V. p
! l3 |+ N% ?1 N
return wcscmp( deviceName.m_str, m_udn ) == 0;* R* H4 i1 ], T- r
}. ^8 b2 x# N" Q+ y
CComBSTR m_udn;5 y" t; i: ]+ [6 d8 ?; h! q
};- _. b/ ]/ [ B0 w, v% Z) p
0 w6 t G: M5 e8 A6 v1 x8 e0 d% n void ProcessAsyncFind(CComBSTR bsSearchType);
( G$ ^7 Y# `1 E HRESULT GetDeviceServices(DevicePointer pDevice);
) c8 s% Q! V1 }5 j void StartPortMapping();2 c2 B x8 [. e7 X3 m* Y5 d5 t" C
HRESULT MapPort(const ServicePointer& service);& I9 W5 R& G2 a, v: M+ G" d
void DeleteExistingPortMappings(ServicePointer pService);9 x3 C( p* f5 L3 {4 r3 s* J1 `
void CreatePortMappings(ServicePointer pService);' @/ ?) O+ I( n! a4 v) ?/ e% J
HRESULT SaveServices(EnumUnknownPtr pEU, const LONG nTotalItems);
7 R" O( B( m6 y3 Q5 e4 B, q7 ^# v5 ] HRESULT InvokeAction(ServicePointer pService, CComBSTR action,
7 Y3 R9 f" S; l3 @ LPCTSTR pszInArgString, CString& strResult);5 [- R! F1 r9 ]3 t. [# N f
void StopUPnPService();+ T9 f9 J' q N& c( P
9 ^: T' ?) ]3 {: G9 S! ]: v7 V
. {8 T( V2 d2 R9 m // Utility functions7 T+ {- Q: Z. ~! w/ Y
HRESULT CreateSafeArray(const VARTYPE vt, const ULONG nArgs, SAFEARRAY** ppsa);
- h7 S% U) X; X/ O. ^* X1 L7 d3 c INT_PTR CreateVarFromString(const CString& strArgs, VARIANT*** pppVars);$ n; t; I' K/ O! U! }% W- h# v' ^, s. f
INT_PTR GetStringFromOutArgs(const VARIANT* pvaOutArgs, CString& strArgs);) m- o' A% X7 ?+ A- l# ?( B
void DestroyVars(const INT_PTR nCount, VARIANT*** pppVars);
4 P, U+ ~1 v5 K$ E2 B HRESULT GetSafeArrayBounds(SAFEARRAY* psa, LONG* pLBound, LONG* pUBound);
. D- H& J: q. c' z( g HRESULT GetVariantElement(SAFEARRAY* psa, LONG pos, VARIANT* pvar);: X& X' f# D; Q* c% \% k, W
CString GetLocalRoutableIP(ServicePointer pService);
7 B, y" W0 [7 Z+ {
+ j) @2 E4 P$ Y) s. f9 ^1 y5 ^8 I) w# f- L$ z8 t5 D& a5 `
// Private members
5 L; ~* r1 Y- H/ @: u/ G: Bprivate:9 E7 Q3 @ q- b
DWORD m_tLastEvent; // When the last event was received?* H; r$ X4 y, K9 T6 W" A
std::vector< DevicePointer > m_pDevices;
# O1 l7 L+ `' L7 B8 E0 \' r! X5 { std::vector< ServicePointer > m_pServices;
3 x, h" O* C2 H: E. _# E! p+ Z FinderPointer m_pDeviceFinder;
q6 |0 p4 h& ^9 }8 x DeviceFinderCallback m_pDeviceFinderCallback;2 B2 z# e% r% r7 b, H0 q/ N6 Q
ServiceCallback m_pServiceCallback;
: G# y! P# P9 I) y8 H
, e) x% _) k4 s: v0 P6 k5 a7 D' v' E+ v7 l7 X3 t9 }
LONG m_nAsyncFindHandle;4 U. p7 H* c, Y( |+ K6 e6 t
bool m_bCOM;
8 K: F I, k. `8 m. K9 ]+ } bool m_bPortIsFree;) g* E7 U, ]* E
CString m_sLocalIP;
/ W1 }" o1 v- p3 E" z3 Z CString m_sExternalIP;3 {) h: j7 y5 Y, w( U! ~, O
bool m_bADSL; // Is the device ADSL?
# H% g' E9 s# r& {6 Z* c, u: G/ \4 o0 F bool m_ADSLFailed; // Did port mapping failed for the ADSL device?
. s9 K- H4 N' m/ F Z, j0 u bool m_bInited;; @) n5 j+ G, x
bool m_bAsyncFindRunning;
) A+ A; ]; C; X HMODULE m_hADVAPI32_DLL;
) @0 V% a9 U6 e) Y/ n9 c8 K! q HMODULE m_hIPHLPAPI_DLL;* L, v$ K2 _ i$ g# f3 L+ L( ~
bool m_bSecondTry;% v7 V, L% s J% x
bool m_bServiceStartedByEmule;1 \1 o% O, Q0 |# U( j- A. V7 L. n
bool m_bDisableWANIPSetup;
4 z, w( p1 e5 V. g bool m_bDisableWANPPPSetup;' i. O$ ]& h4 M7 B$ ?5 c% \
4 q6 N5 e. }. P I' u
2 \8 Y( w5 w3 d6 T
};- L) {& o% M% H6 ?& t$ N
3 X% R% M, ]! H" [! I" Q
+ Z3 @& }5 R# p- c+ P3 r// DeviceFinder Callback
2 K* ?7 _: s! I; Y4 j6 Yclass CDeviceFinderCallback
) ]2 k) X" `- _# p e& n : public IUPnPDeviceFinderCallback9 }9 K$ x* P: ^; B( o/ [; h, n* m
{
& A. t1 D. S% ~" |4 Qpublic:
5 a# R+ _' t* s. q2 W CDeviceFinderCallback(CUPnPImplWinServ& instance)
0 M8 ^$ |" c; p/ s2 T3 } : m_instance( instance )
5 h* z9 b! [4 T4 J { m_lRefCount = 0; }
1 n3 W% o: r' p& B+ W/ b# o( U4 G: p, Q1 k% _& F
" J% U* w1 C4 b- I! C9 r5 _
STDMETHODIMP QueryInterface(REFIID iid, LPVOID* ppvObject);3 e# u i8 @% m# X) ]& n
STDMETHODIMP_(ULONG) AddRef();
2 N8 P7 p( N: I: E% k$ \ STDMETHODIMP_(ULONG) Release();
7 |/ V9 b0 [& S) v p& E9 n
2 v) f9 C% m/ G2 ?: j6 Z# g2 T' d
// implementation8 d" c9 O6 w' O$ @
private:
3 x% X* ^9 K' P" K+ o, q) A HRESULT __stdcall DeviceAdded(LONG nFindData, IUPnPDevice* pDevice);4 G6 |, C9 G$ W/ w% |2 p6 x, ^* C
HRESULT __stdcall DeviceRemoved(LONG nFindData, BSTR bsUDN);( l( l, F8 K0 @ i
HRESULT __stdcall SearchComplete(LONG nFindData);
2 w( L4 ~1 G3 s# f) C Z% {- }3 t% y' d, [
( x# l8 o. [ ]* f
private:, @& O5 a4 B$ V0 q+ T9 x4 t* \4 J/ S
CUPnPImplWinServ& m_instance;
1 O6 I$ c* A4 r LONG m_lRefCount;
0 H1 k7 x1 f$ e4 O4 F8 T8 X5 ^( P};
' M g) v8 r* b* ^, A6 S! w2 t
9 U, K+ E7 h) ?6 ?" H7 \: ^; l$ i1 v: I) h# f3 m# D" N- j
// Service Callback ' U) x, P; v$ @
class CServiceCallback* ~0 H: ^0 C8 ~7 }
: public IUPnPServiceCallback9 T, H7 Z7 H& D$ u5 j
{
+ J1 \: h9 o! E5 k3 ]$ J) k/ _; hpublic:- T$ |. j { E- g
CServiceCallback(CUPnPImplWinServ& instance)
$ B. i+ C a- a: k : m_instance( instance )
4 N' R6 t# G% C: A { m_lRefCount = 0; }; l% O5 n! S, G
- c4 G N0 `' k+ N$ U/ W# W6 [ STDMETHODIMP QueryInterface(REFIID iid, LPVOID* ppvObject);9 ~. ~- e0 y( B* Y
STDMETHODIMP_(ULONG) AddRef();4 \( x1 }( q+ v7 T) }
STDMETHODIMP_(ULONG) Release();
; n! _" n- E+ z$ h: g6 g! n' n2 M1 s5 {7 F3 t7 i
" W6 {: ^3 h) f( f: u1 V. L// implementation
' V7 ]1 ]' m( E" x' r, E5 e- J" Vprivate:, ~2 W, e1 w* S
HRESULT __stdcall StateVariableChanged(IUPnPService* pService, LPCWSTR pszStateVarName, VARIANT varValue);+ Q0 z0 L+ B1 s8 f. J( a' `: Z
HRESULT __stdcall ServiceInstanceDied(IUPnPService* pService);
" T- P% O; S) E1 v% a. [/ U' {* @; j+ V8 U1 o G# X" r; h" {. `) [
. S4 i7 e& ?9 ~0 q6 m+ S7 c/ O, cprivate:
' T( f! V# [/ j$ l CUPnPImplWinServ& m_instance;
* `, c2 a# ]/ X; D$ o- A LONG m_lRefCount;
" r5 D" F1 L5 i) B% ~2 w' K};
$ N6 G; F$ a/ z! O/ v# G; [7 y/ s/ F, S4 e
3 n. x$ F+ k$ i2 t
/////////////////////////////////////////////////% |2 S/ n& h0 o8 Q x
3 D9 Q- o; q$ l8 V, ]
/ D7 Y+ I" z; S/ H" o- L1 L使用时只需要使用抽象类的接口。
% F X% s$ c" Q4 j1 Y% E" BCUPnPImpl::SetMessageOnResult设置需要接受UPNP端口映射是否成功的窗口句柄和消息ID." Q& p# Y3 i$ z# C& A. I! A
CUPnPImpl::StartDiscovery将开启一个异步设备查找并进行端口映射,其参数为需要映射的内网端口.
% z% o1 u- _7 s. K9 g6 m8 ACUPnPImpl::StopAsyncFind停止设备查找.2 Z* ~* p- }' ^7 K6 h
CUPnPImpl::DeletePorts删除端口映射. |
|