|
|
楼主 |
发表于 2011-7-15 17:28:52
|
显示全部楼层
以下有关upnp的接口来自emule,
! Q$ y, b! C3 y3 n, _% h d4 b
0 Y! L \% Q# |2 i
! w6 v7 O4 w+ t3 g; T* l9 ]: }2 h///////////////////////////////////////////# w; v" T3 Y" d% }, o
//upnp的抽象接口类,只需调用这些接口即可实现端口映射功能.% @5 A# F! a6 i$ |& {. D
0 r) J/ m% y* V# W6 O
8 L3 Q }! X% w6 M0 H" e7 E
#pragma once7 k0 w4 o6 X+ U: l- B7 Q
#include <exception>( H5 r+ ~& ^3 W/ F
_ t4 D$ L! Y* r( u$ p+ I
% a0 a) P, s1 G8 y& U9 V
enum TRISTATE{5 w1 ~2 Z% y3 r- i: L& Q
TRIS_FALSE,
% a6 U; C' |% d; P. m+ k: Y" K TRIS_UNKNOWN,' @: l8 l z9 W: T
TRIS_TRUE, f0 S$ O& i( h/ ~0 c% J4 T4 e
};6 K5 `$ e |, T7 _4 g
1 [1 v" D. Q* u, X3 @7 D
; n; g$ g, U" x/ G/ ~5 u h
enum UPNP_IMPLEMENTATION{
) P; M% q4 P9 M5 H UPNP_IMPL_WINDOWSERVICE = 0,
; C/ y" I6 d! S! i UPNP_IMPL_MINIUPNPLIB,
/ X- E1 e) J0 D$ b% L UPNP_IMPL_NONE /*last*/$ I# u+ B" D# Z; C
};/ }: d9 Q9 G( F3 i
& A5 c# r9 ]6 [ _ l4 U7 o0 h* z
& K7 d8 ^8 H' j1 `, m1 ^
K) T: Q, D4 X& C' c2 m5 L
- E% ?) ~$ [( X% Q( C; G2 } U1 [' B
class CUPnPImpl
, A3 z% X% S/ B" s{
* @' w: c6 u# `4 T1 Z/ Ipublic:; u) ?, d# }% K5 J
CUPnPImpl();
! s7 {# w' L Y, ^; Q N; i! b1 [ virtual ~CUPnPImpl();
$ }6 N7 b7 N# q" m3 [ struct UPnPError : std::exception {};
5 z% w9 n: X$ v' q/ O& K5 [ enum {
: U% `5 d/ h3 {6 C- D UPNP_OK,
7 ?, Y6 d+ b& I UPNP_FAILED,' f% L5 J( }! Z9 e9 v( k6 {
UPNP_TIMEOUT& p0 g1 o0 G. e
};# b- i5 G" t; R; b R) T' b
5 i. X0 b) u a" y% \
* t4 p) B4 Y. X C% p! r/ y, W! K; n virtual void StartDiscovery(uint16 nTCPPort, uint16 nUDPPort, uint16 nTCPWebPort) = 0;
( m# S/ P8 D7 z; C, T# \" z* h virtual bool CheckAndRefresh() = 0;4 {2 l, H9 y* z7 G5 G
virtual void StopAsyncFind() = 0;
* x# `# D0 Z+ K4 q0 J+ a3 Z virtual void DeletePorts() = 0;
}. J. y3 t e3 ? virtual bool IsReady() = 0;; L: ^# [( J4 d8 Q
virtual int GetImplementationID() = 0;
" _& @( h. y7 Y9 e& \& i 1 M: J6 i0 `, N+ a5 }1 S
void LateEnableWebServerPort(uint16 nPort); // Add Webserverport on already installed portmapping
. K/ s, s9 u1 x7 E4 p7 K6 u+ ~) Q& y1 Y( D& t4 ]
/ L# V6 F8 u8 Y+ O$ |& _0 U" t' G void SetMessageOnResult(HWND hWindow, UINT nMessageID);" k' c& `5 Y, g" ^- B% E: |
TRISTATE ArePortsForwarded() const { return m_bUPnPPortsForwarded; }
' D1 z! G# u7 I- [) ]9 g# h uint16 GetUsedTCPPort() { return m_nTCPPort; }
- e6 \1 {, m) Z uint16 GetUsedUDPPort() { return m_nUDPPort; }
5 f, b* G W+ x6 e6 K3 K g4 k" x2 J9 ?2 r, r, F& V5 p
/ s" W( i9 a7 d$ j: N
// Implementation1 Z7 t8 W, f3 _/ z0 g5 w; a0 v
protected:0 T* u9 d3 l4 Q0 s/ r
volatile TRISTATE m_bUPnPPortsForwarded;7 c. i: n) o# S$ T
void SendResultMessage();
1 ]0 c! ?( ~1 r" }: s9 J- x uint16 m_nUDPPort;( o0 Z" r& S9 W* X7 f
uint16 m_nTCPPort;+ l# F [' ~" b1 m. ~
uint16 m_nTCPWebPort;
`4 o8 ?. P4 V) p" j$ a bool m_bCheckAndRefresh;( X2 z1 ^8 @% d9 N) H
* M' E* M6 O/ b5 U
* g) ^8 a1 j& {1 Q
private:
9 r5 w2 c# b: p8 z' ]$ @! ] HWND m_hResultMessageWindow;6 ^( H3 u! d5 ?4 C
UINT m_nResultMessageID;5 U" x) j7 P# P6 H* U
+ M% w% F1 D" b ]/ d4 \2 l5 R5 c; Y) i/ K. B
};
3 G1 e6 m. N; C4 W$ N: t0 p1 A+ l0 q
6 ?7 I* P" L3 d5 f* v
1 i" ~; L5 V, W* l g// Dummy Implementation to be used when no other implementation is available# Y! {" ] V) Y3 A8 k& i
class CUPnPImplNone: public CUPnPImpl3 C7 V$ _1 _1 s' J6 s' g# e- v
{
* o4 |: {1 [- w7 Y( h* |# h4 Y# Mpublic:- t1 a, l W5 ^8 T) m* k$ z
virtual void StartDiscovery(uint16, uint16, uint16) { ASSERT( false ); }! \" w# ^6 h: L/ q) Q: b0 c
virtual bool CheckAndRefresh() { return false; }
7 ^7 Y/ P# J, ~* O5 m" T2 v virtual void StopAsyncFind() { }+ r! p0 V, R- ^* ~& A. D
virtual void DeletePorts() { }
: |6 m9 a6 h; a virtual bool IsReady() { return false; }
2 o; Z: P, B$ u# e virtual int GetImplementationID() { return UPNP_IMPL_NONE; }! ^3 J/ f8 b+ p+ B: t! c2 ?% M: V
};
+ z' L8 m5 x) [. D) |" h# y# `) e9 b; S
; p& ~7 [" y3 ^! b1 P- D
- V) ? T' K: R/////////////////////////////////////) B$ ?7 L/ _* R) G+ O* D2 z# c
//下面是使用windows操作系统自带的UPNP功能的子类
4 J; Q) N6 k# ]9 Y! S
) p8 y \" v B& K) N1 l# [5 g
#pragma once8 ^5 I( ]6 T8 s, Z3 `
#pragma warning( disable: 4355 )
8 f+ }5 V6 p6 X7 F
/ @. u% c9 n" Y; c6 }* V. X8 ]& ]' U% ]! }# v
#include "UPnPImpl.h"
: y4 s D, m i% c+ s5 [: K1 e#include <upnp.h>1 s, O) u ]0 S% |
#include <iphlpapi.h>( Z9 w$ F% @3 g; k1 m3 U. Y5 d
#include <comdef.h>
! p) ^/ f `* V. Q% ~#include <winsvc.h>+ {" C/ K9 s4 a! `5 o8 e" J
. e0 M5 `8 k3 {
. A- E5 L+ l7 s8 E+ M. r# Z, b#include <vector>$ u3 A( l: h2 `/ ^ C/ s! F
#include <exception> z: B5 H4 }4 `- c/ i
#include <functional>. h- @* s9 f* P, @* w
2 s0 f( y x' b5 m# p2 I9 b/ t) q* x' K* R3 S9 e6 F
" q( A8 P2 v! R& j; W: j2 o; t) Y. y8 f% o4 P
typedef _com_ptr_t<_com_IIID<IUPnPDeviceFinder,&IID_IUPnPDeviceFinder> > FinderPointer;6 T0 j% @4 @5 Z, L' _8 f$ [
typedef _com_ptr_t<_com_IIID<IUPnPDevice,&IID_IUPnPDevice> > DevicePointer;, V) O* L4 ]$ M, V+ ]$ @6 X
typedef _com_ptr_t<_com_IIID<IUPnPService,&IID_IUPnPService> > ServicePointer;1 ?+ r% R. Q+ p. ^ B
typedef _com_ptr_t<_com_IIID<IUPnPDeviceFinderCallback,&IID_IUPnPDeviceFinderCallback> > DeviceFinderCallback;
# W# q# k' M# ntypedef _com_ptr_t<_com_IIID<IUPnPServiceCallback,&IID_IUPnPServiceCallback> > ServiceCallback;
# S2 F$ d& a' H" Vtypedef _com_ptr_t<_com_IIID<IEnumUnknown,&IID_IEnumUnknown> > EnumUnknownPtr;" I6 ^: m$ z# w- \* h7 V8 P
typedef _com_ptr_t<_com_IIID<IUnknown,&IID_IUnknown> > UnknownPtr;
" D ]" [( L& e. M+ N- x( v2 R1 @7 b
" s P4 C7 P0 |1 u4 B5 b, U* _) U/ t
typedef DWORD (WINAPI* TGetBestInterface) (4 v, R/ m1 T0 ~7 g1 Y/ j
IPAddr dwDestAddr,& V2 L4 Y2 G- S+ r: T* ?
PDWORD pdwBestIfIndex* j0 V; f1 z; P( V
);
. L3 h! Z, v! `; I. v V, T' i g$ g' `4 o+ u1 W3 ]
Y1 C: @% E) Ptypedef DWORD (WINAPI* TGetIpAddrTable) (
9 Z# w T" ?8 A, w+ V$ \" G2 l PMIB_IPADDRTABLE pIpAddrTable,- G8 t! I1 n) C3 \. b& M/ r7 p5 W/ A
PULONG pdwSize,
, y2 e8 h! M' K1 L" [9 j; i BOOL bOrder
; W7 D# R5 y2 ? L$ j8 [: l/ j);+ l w8 _* k% i& _: ?* m
# A" C' X. J! G- ^5 O1 n) ]
( }8 t* X5 ~* Mtypedef DWORD (WINAPI* TGetIfEntry) ($ U+ M. n ^0 k
PMIB_IFROW pIfRow
) z/ w7 W. p, D0 S& Z' t);
( }$ n. n1 @' _7 m) S9 x, \% f" q4 P. ]" ~: ]
. [; b8 D& h+ g2 w9 D/ l) g& |
CString translateUPnPResult(HRESULT hr);- ^8 o7 ~0 r( F P2 i h( F: O
HRESULT UPnPMessage(HRESULT hr);# D8 X, P+ Y8 z$ n m
/ B4 \" Q! G. E x( {" E9 @& A) c) i5 }4 _9 p9 s% l
class CUPnPImplWinServ: public CUPnPImpl; c; Z" r7 e6 [
{
' N" E* w+ C+ F; Z" T" Z2 e friend class CDeviceFinderCallback;
3 D8 |7 }0 U8 q3 e, Z- w friend class CServiceCallback;
; W7 Q. B7 n7 ~" m$ R0 g// Construction; |1 _1 J4 A& \/ u- f0 r, j( `" B
public:
% ^9 w9 C; A- }* d, r' K virtual ~CUPnPImplWinServ();
! p) G* S% P/ n4 j6 v CUPnPImplWinServ();. ?$ }# i" |0 {( K- W/ Q! V$ x r: c( L
; |* c8 _& a7 {0 {4 s0 z. R6 {$ m/ U# A4 J4 q! ^
virtual void StartDiscovery(uint16 nTCPPort, uint16 nUDPPort, uint16 nTCPWebPort) { StartDiscovery(nTCPPort, nUDPPort, nTCPWebPort, false); }- q3 ?- J9 g0 a; s0 }7 R. W
virtual void StopAsyncFind();5 D; n1 s4 a4 z! Q8 d
virtual void DeletePorts();
1 v; W a3 Q* F/ W( U& Z virtual bool IsReady(); r1 h" N$ ]1 ]8 C, c& T0 s: j
virtual int GetImplementationID() { return UPNP_IMPL_WINDOWSERVICE; }& Q! j1 [0 W' Z' `% u8 p
8 i) r' L9 p- W% f# g% m) J" a" k
4 ?& x! K4 R) k
// No Support for Refreshing on this (fallback) implementation yet - in many cases where it would be needed (router reset etc)8 z% A. t4 ~% s, _2 F( o1 H4 z, V) A' |. E
// the windows side of the implementation tends to get bugged untill reboot anyway. Still might get added later
% n& i7 }7 t9 ]- t+ C virtual bool CheckAndRefresh() { return false; };
2 Z+ w. h- V( F" K; r- ^
* ^/ s4 e1 u& V( v# x6 q: i1 v# Z
% a4 ^9 E! U. J5 F6 Fprotected:5 i8 P0 Z) K, U+ A
void StartDiscovery(uint16 nTCPPort, uint16 nUDPPort, uint16 nTCPWebPort, bool bSecondTry);4 Y/ w' w y4 [1 m
void AddDevice(DevicePointer pDevice, bool bAddChilds, int nLevel = 0);* ]3 l# t+ e; V
void RemoveDevice(CComBSTR bsUDN);
" A0 j0 I. t: l$ E# m bool OnSearchComplete();% }) U: W2 [) O) W' t
void Init();, M- T8 B9 x" G& H" w3 `, y) G
$ l% u9 {, v/ i$ g3 }2 R4 _2 d8 h/ L8 o8 s
inline bool IsAsyncFindRunning()
2 p2 F& U5 P4 N6 E$ Y {
+ k7 E8 o$ `+ i7 ~/ \+ } if ( m_pDeviceFinder != NULL && m_bAsyncFindRunning && GetTickCount() - m_tLastEvent > 10000 )
- j! |- ~; Z1 I o {
$ d1 Y( m7 [5 q m_pDeviceFinder->CancelAsyncFind( m_nAsyncFindHandle );
% q4 y5 ]* [, C2 l: S) B8 B m_bAsyncFindRunning = false;
+ b3 a6 i. m; F. p) X3 y }
/ @* C# F/ F4 T- w8 t5 |+ u* y$ v, w MSG msg;6 d- l& E$ d/ A4 r5 h2 J
while ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
( d! a% b8 M N; f0 S {6 E/ A ?9 u& ]
TranslateMessage( &msg );" m: I9 o' ~& [
DispatchMessage( &msg );
( `3 G, i1 Y1 x9 j }
! F# P2 o$ @& A9 |/ q" a: V return m_bAsyncFindRunning;; F( f1 q+ B; s. N: {
}
' r) s: w, ?1 `$ \, p s; h: d k: Z1 s1 n- j# G2 j
$ |9 f# Z1 z/ w% w TRISTATE m_bUPnPDeviceConnected;$ |2 k/ V$ [- F1 d3 O0 A7 Z
5 K! B: ]3 A% X8 z" K" D; |
3 g8 Y5 N2 n" Z, A- n/ g// Implementation$ b) b6 M( `6 `6 l0 R- B4 n- _
// API functions
8 n, H' @; F. z o. b4 `, R SC_HANDLE (WINAPI *m_pfnOpenSCManager)(LPCTSTR, LPCTSTR, DWORD);
5 ~; j) V0 g* R4 s SC_HANDLE (WINAPI *m_pfnOpenService)(SC_HANDLE, LPCTSTR, DWORD);" q$ }9 `; u6 X$ q4 `0 V6 H' T3 L
BOOL (WINAPI *m_pfnQueryServiceStatusEx)(SC_HANDLE, SC_STATUS_TYPE, LPBYTE, DWORD, LPDWORD);5 F; L/ P( \! m8 d+ N( U2 E9 R/ V
BOOL (WINAPI *m_pfnCloseServiceHandle)(SC_HANDLE);
) h) H# k$ A5 i, @/ @* i3 ~ BOOL (WINAPI *m_pfnStartService)(SC_HANDLE, DWORD, LPCTSTR*);% m1 I( Q S/ v! V+ {4 n
BOOL (WINAPI *m_pfnControlService)(SC_HANDLE, DWORD, LPSERVICE_STATUS);
0 ~$ k" T) T! \ d( q8 n' N) f4 s3 Z
% o4 G: O) g7 p3 K9 Z& ]3 Z
4 l/ P) q& V4 G TGetBestInterface m_pfGetBestInterface;2 V3 _, c0 l9 N r9 V/ I
TGetIpAddrTable m_pfGetIpAddrTable;; Q% g |8 \$ }0 s) a# t: H4 A
TGetIfEntry m_pfGetIfEntry;
7 n2 F1 g0 A% K3 Q/ d4 u; m) j' |6 k, u& I2 v0 S& G$ {
) l- G! t7 T& i! Q% ~1 } static FinderPointer CreateFinderInstance();
9 Y% F+ I+ G* f struct FindDevice : std::unary_function< DevicePointer, bool >
' j8 z2 B( Y1 ?* v1 k( z4 \- t6 }5 t {9 K! f5 q0 ?: y+ [! ]& A
FindDevice(const CComBSTR& udn) : m_udn( udn ) {}
/ ^& \: A& t6 K% y- E+ m" f result_type operator()(argument_type device) const) u: T' d. [# {5 |1 l- X& a
{
) l; p8 E3 [3 x CComBSTR deviceName;8 s8 O9 f- ^6 f! u N2 a$ r
HRESULT hr = device->get_UniqueDeviceName( &deviceName );
; d5 L9 V, T3 E) i6 c
# t$ [' @9 w9 m& {! M0 E9 P; e8 V5 R, T
if ( FAILED( hr ) )
2 R) A: K6 M& M) T% S ^4 ?7 m return UPnPMessage( hr ), false;
$ g' u' N. J- P; P, V
1 R: ~: W8 A% X* u+ O+ u6 T1 e
) |0 F: S& t3 s/ \2 c return wcscmp( deviceName.m_str, m_udn ) == 0;
; J Z" n) j6 H) \, T, x }
" J: u/ s3 f% t3 u: k CComBSTR m_udn;
4 Z2 q( } V8 P, M) t( _4 U% U };
% N G8 E; C& J* C- ?3 c
' D/ o8 B* e5 w/ d7 m7 M void ProcessAsyncFind(CComBSTR bsSearchType);5 s# ~2 T0 j! Z" D! R$ ~4 Q
HRESULT GetDeviceServices(DevicePointer pDevice);
+ c0 e, `: c: [0 Y' X7 a2 M void StartPortMapping();% F5 I3 J. P, @2 L
HRESULT MapPort(const ServicePointer& service);
$ m* G# P+ u2 H. f/ o9 M void DeleteExistingPortMappings(ServicePointer pService);
% }5 k4 S, y9 s3 r0 {. k5 ? void CreatePortMappings(ServicePointer pService);
+ N* l/ q, J+ h9 @. t HRESULT SaveServices(EnumUnknownPtr pEU, const LONG nTotalItems);1 G" y/ ~+ D, }" _
HRESULT InvokeAction(ServicePointer pService, CComBSTR action,
+ a- b( m+ w1 c0 W+ x LPCTSTR pszInArgString, CString& strResult);
0 I& `: w4 r7 R$ k6 r void StopUPnPService();$ r. p; R! f# Q+ J- B9 L+ |9 z7 y
/ Q' L Y; F, I
- ^) Z" B. x* ]2 c5 T! U6 f
// Utility functions
+ S3 s6 n/ f( u" t$ g7 t( e! F$ E HRESULT CreateSafeArray(const VARTYPE vt, const ULONG nArgs, SAFEARRAY** ppsa);
9 g2 t' {1 @ l* ]% l; [2 i" Z INT_PTR CreateVarFromString(const CString& strArgs, VARIANT*** pppVars);
" e! y: I; c) L& b" E$ k& R E INT_PTR GetStringFromOutArgs(const VARIANT* pvaOutArgs, CString& strArgs);' r& ^+ I5 I( u- c, u
void DestroyVars(const INT_PTR nCount, VARIANT*** pppVars);# n9 h0 H3 i, ]+ j# `
HRESULT GetSafeArrayBounds(SAFEARRAY* psa, LONG* pLBound, LONG* pUBound);9 b: M4 t4 i7 W: y$ x
HRESULT GetVariantElement(SAFEARRAY* psa, LONG pos, VARIANT* pvar);, i4 z% R @( H6 I# Z9 Y6 M
CString GetLocalRoutableIP(ServicePointer pService);
7 _* N7 i* F: _0 s
3 |9 i# V# g5 v4 B, A/ k% M
$ K2 @0 {/ p7 i( R( x: n U/ c// Private members M/ D/ C5 C& A8 R+ S8 ?
private:
6 m! }( ?5 g: Q9 I/ s1 h) r# v DWORD m_tLastEvent; // When the last event was received?
4 p9 \, g: O, t4 I+ ? std::vector< DevicePointer > m_pDevices;
: q' c8 R4 k+ t2 I' L- E std::vector< ServicePointer > m_pServices;( h+ i& p2 E7 [ `7 L
FinderPointer m_pDeviceFinder;
L. g% X$ B% u; B DeviceFinderCallback m_pDeviceFinderCallback;
5 O/ n8 d2 Y: A& x ServiceCallback m_pServiceCallback;
I0 @4 }" `- d* a
" N$ \$ U# Q8 e9 j- Y- a8 X% f# m2 Z; d2 v" O, v
LONG m_nAsyncFindHandle;
1 S6 _6 u- |# A9 p) t bool m_bCOM;4 r( e8 Y2 Q" e* ~# s, b9 w2 A, P
bool m_bPortIsFree;
% A6 v5 R& b W CString m_sLocalIP;. v; P4 R' @, L- T
CString m_sExternalIP;9 Y8 a) C* D: I
bool m_bADSL; // Is the device ADSL?. B& O( T1 f$ B( s
bool m_ADSLFailed; // Did port mapping failed for the ADSL device?0 ?4 M, i. o, n J; V
bool m_bInited;
1 w% Q. s$ L2 H H2 b7 j j7 G* u bool m_bAsyncFindRunning;
1 Q) A4 P" @! m( x) Z i/ ` HMODULE m_hADVAPI32_DLL;, D3 C2 u* Y- P8 U# k
HMODULE m_hIPHLPAPI_DLL;
5 ^- W5 y. L- G" Q$ H bool m_bSecondTry;/ ?+ L; O, D5 o/ c+ E3 j) H" b
bool m_bServiceStartedByEmule;: H7 H; g+ w3 A
bool m_bDisableWANIPSetup;
( h# l" q7 N8 s, r: f' Q! E bool m_bDisableWANPPPSetup;
- H0 G' I0 [ K: j5 V, J1 P/ [( K6 ^4 J1 W1 h& R) A
6 \4 V; \) r g i: S+ h2 b0 a
};; H: I4 B$ [) E) F3 I: o/ q9 J
% j; o) V$ w0 T* u
9 t$ h( R Z- C% W5 v) ? z// DeviceFinder Callback/ a4 D1 Q* \2 ]
class CDeviceFinderCallback
: u! B. L/ Y0 z : public IUPnPDeviceFinderCallback3 _+ I. `4 j1 H- e* O {" k3 }
{; m* Z7 ~$ x8 s+ Q b2 u0 |. u& j
public:
+ M+ e$ M9 k; f. e! d- |$ r CDeviceFinderCallback(CUPnPImplWinServ& instance): ^0 D) Q+ |- p
: m_instance( instance ); [4 T$ W h1 C$ ^* K
{ m_lRefCount = 0; }! u' O+ U7 Y8 j+ F$ ]7 q
9 U: Y( k" M9 K; L2 z3 [# r0 i. O7 J( c4 b* t# q9 M
STDMETHODIMP QueryInterface(REFIID iid, LPVOID* ppvObject);
6 g6 r% \9 W! y3 W% c% f5 U STDMETHODIMP_(ULONG) AddRef();- A2 Y8 \# L* d
STDMETHODIMP_(ULONG) Release();
) B) G, }7 X- w$ f; e1 v# j& t* a0 h) M8 ]& L4 ?& ?
) g4 ^; |8 N6 f/ c6 k5 i% ?% B
// implementation
8 A3 \6 b6 u) p7 g; iprivate:0 F' V8 [# F: E8 Q4 Z
HRESULT __stdcall DeviceAdded(LONG nFindData, IUPnPDevice* pDevice);
3 G) ]! R4 j. w3 P0 M1 U6 r HRESULT __stdcall DeviceRemoved(LONG nFindData, BSTR bsUDN);
. [6 _! `1 b2 y4 q' G. c HRESULT __stdcall SearchComplete(LONG nFindData);
" ~% ]2 A1 Y# M0 J5 X1 ~8 K% S; N! Y
6 L; e9 I" {) H( W' N- yprivate:0 J# V! u9 P4 C) h& N6 y
CUPnPImplWinServ& m_instance;& [& Q2 I" |9 Q; ]- C+ p6 A/ R& C
LONG m_lRefCount;5 r" j; y, y+ U4 w5 _$ P2 g
};
& W7 ?8 h, K k: m
4 l& T' C3 ~( h2 ?. R4 a
* ^3 H+ B( M- m3 q7 b// Service Callback
/ L+ r% t( T N7 s1 ?0 U8 Zclass CServiceCallback
+ C% W( |& q. I, e" o, {: a : public IUPnPServiceCallback7 J8 d$ H/ `/ c: n, Y3 `
{
& p; U1 h, D' Z l; Gpublic:2 K0 l5 a+ S ], X
CServiceCallback(CUPnPImplWinServ& instance)
. y. K! K( M, N3 `4 A5 s : m_instance( instance )
3 o0 @" h+ K! f* k& }( i- m { m_lRefCount = 0; } ~2 u8 @9 t. n1 K/ {
- Q0 Y3 V# A ^$ ~% W2 ^ STDMETHODIMP QueryInterface(REFIID iid, LPVOID* ppvObject);
$ L# R+ h* E4 \- W( @0 [ STDMETHODIMP_(ULONG) AddRef();
4 G+ p) U: V# G s4 B1 {0 V" { STDMETHODIMP_(ULONG) Release();% ?; }7 W/ N$ Y7 H ^5 s
N9 U$ q: A5 R$ }! I: z
* ]! N0 h9 Y' T: p: R& F3 g
// implementation
' H7 T6 I1 w) T4 ~, s$ @/ uprivate:/ q4 B/ Z" S/ e2 s8 `* H; M
HRESULT __stdcall StateVariableChanged(IUPnPService* pService, LPCWSTR pszStateVarName, VARIANT varValue);
( h# E: P, v0 Q9 N0 l, e HRESULT __stdcall ServiceInstanceDied(IUPnPService* pService);2 z' K+ H4 W$ L2 V
6 q, j p, _0 G, G5 X/ z6 Y; a b+ Z1 [( A
private:2 Q7 j! C# \ @# ^5 z5 J. Y3 K- h- p
CUPnPImplWinServ& m_instance;8 a/ e# G0 R4 Y) U. I
LONG m_lRefCount;/ F( e/ z+ H6 E% \1 |9 U" n. Z
};5 V3 z; g, b& Q5 C8 n/ W
, q k- J8 t' i+ r" G l% v1 q$ I/ j8 l! j, s0 f4 I$ @7 h! D: x
/////////////////////////////////////////////////
& \7 Y: l# ]! e5 I
' e; r7 e2 u# M) H% U# v W* o5 M2 U, H3 j, B
使用时只需要使用抽象类的接口。+ z" Y1 Y/ ^3 X% `% z
CUPnPImpl::SetMessageOnResult设置需要接受UPNP端口映射是否成功的窗口句柄和消息ID., v. i( k: c( _" _
CUPnPImpl::StartDiscovery将开启一个异步设备查找并进行端口映射,其参数为需要映射的内网端口.
( B: s. c9 A( B7 jCUPnPImpl::StopAsyncFind停止设备查找.+ v5 {" Q# C2 z6 z# a+ W4 X
CUPnPImpl::DeletePorts删除端口映射. |
|