|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec058
$ g0 { U& ]$ `) W( X `By Mukta & ToxicDream- * l' `! V2 ~: O2 u3 Q
- //for delphi 5
) a, o ^6 p) v' r9 k& u3 j - unit MMDevApi_tlb;
+ t' s( U) e. x4 m! a - ! N! J* N5 _6 a3 n6 b+ L# t! ^
- interface! u: S3 W: j+ b
- uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;2 a! q2 h# u7 J
- const
( l* B# W( ?$ Z" Y - // TypeLibrary Major and minor versions
! x. w8 Y/ C+ d3 w# @$ `% `
5 n1 d$ ]0 a. T+ {/ Q3 C( c9 t- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
3 E0 n; N3 I% y6 b( b - IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
% ~8 {2 `' F6 C( |. Z' w- k2 A, ~7 D - IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
, C: }0 ]! {3 k R D' J - IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
2 c9 c/ {3 H" f; I7 g - IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';$ c. r6 ~$ t) K, q
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
H4 s, f0 @3 a- ] k! q: v& F( Y - IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';, l1 ~' a5 G9 `2 R/ y
- 3 ?, B& v, v" {; j. n8 _
- DEVICE_STATE_ACTIVE = $00000001;$ V6 W8 O2 B2 |7 U3 ?
- DEVICE_STATE_UNPLUGGED = $00000002;2 T0 \. B1 o0 x% p4 M- K
- DEVICE_STATE_NOTPRESENT = $00000004;) c3 M+ {1 m/ Z8 o' F8 m( K( D
- DEVICE_STATEMASK_ALL = $00000007;
$ |7 q$ _: W `4 Q - # f1 s2 k% ?* H
- type- C1 U' [6 u7 x Y- l, M7 k
- EDataFlow = TOleEnum;' n( G0 m- y! _! v% Z0 v% \
- const
: }4 M0 |. T4 C6 Y0 }/ d' w - eRender = $00000000;5 M+ e9 H/ D" G# l' L5 g( f
- eCapture = $00000001;
9 B6 q3 I& C$ q; t! H& w1 w/ k - eAll = $00000002;& S" c$ Q2 V0 P+ j# v
- EDataFlow_enum_count = $00000003;% \# z) a( |% T. g4 D) {. M
* X* j- j( G; p7 G8 [- type
9 B2 f+ S" Q% \7 J6 ^ g, ~ - ERole = TOleEnum;8 l0 O2 R+ \( s4 J, j4 N) |6 f0 _
- const
" O8 [. X& |8 F/ n - eConsole = $00000000;8 a& W; t3 _6 `0 v
- eMultimedia = $00000001;
( `# M+ ~6 }# R9 w - eCommunications = $00000002;
. T& C, {+ B M T% j) s - ERole_enum_count = $00000003;
$ p3 k; j! I' ]8 O# [3 B! E4 a p - ! [$ G2 p! o1 b5 o& a
- type
( }' {/ n) [1 c: K# D/ m - IAudioEndpointVolumeCallback = interface(IUnknown)
; i7 [2 e' X: b7 ?" m- E - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']7 j$ J8 D$ F2 c5 H2 ^4 M* u6 d* r9 q
- end;6 H! O% U! c% s1 @# i! P
- ( y. k. g9 h. ]' ]3 R; B9 C( D- Z
- IMMAudioEndpointVolume = interface(IUnknown)
2 A8 V ], ~6 D3 Q% L4 x5 N, v3 i - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']& y8 p# Z, E+ h; N1 `- {8 P' Y
- Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
, N4 ]5 b% I: ~/ p; o) X - Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;" |8 y% ?( F3 n' Q; j/ p$ A
- Function GetChannelCount(out PInteger): Integer; stdcall;4 ], t; N1 t6 p, b
- Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
& y, m" F8 s$ K - Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
/ I! [ j" | b, \7 i( B P - Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;
3 O9 }, ~9 c( Z* C9 i - Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;
, ^5 _! i$ g }: ] F0 P - Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
: h# A4 q8 O" q8 Z& G: _ - Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;3 r5 S% M( }/ C. T" C- \
- Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;
& b* f* N1 V- k( c/ K- m+ F - Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;" S6 n1 ~+ ^& [$ H
- Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;
m! j' u: l, f - Function GetMute(out bMute: Boolean ) :Integer; stdcall;
- M. g' @- {5 t1 L - Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;4 b, _+ p$ @% W' f$ M9 g/ e: f" k
- Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall; S3 Z4 H! O$ Q9 |$ I
- Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;9 _5 ?0 C, x! `
- Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;* I! y" @, ?7 F f' A
- Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;% g4 s8 Y0 ^" U
- end;
8 ^6 M& s1 N9 Q7 V r( h6 ~ - ) g4 @* Y3 ]9 E& q& z4 F- Q3 D( h
- { IAudioMeterInformation = interface(IUnknown), y5 O. b0 H4 D0 |0 w
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']
, ~" r# a" Y7 u1 g - end;}
6 t! T0 D0 @5 l) O- B1 S - 8 o; {* L# ?* O
- IPropertyStore = interface(IUnknown) @; C. d2 l1 ?/ y
- end;
i: H2 z# s7 O& U - : ^0 t Y8 N8 K5 s1 `
- type
5 Q( r$ A: y: O. F8 e0 i4 ] - IMMDevice = interface(IUnknown)
7 h: C+ f. I7 m) Y6 c7 B. \ - ['{D666063F-1587-4E43-81F1-B948E807363F}']
6 V3 P7 q/ U- M( R- U7 o8 w8 o - Function Activate( refId :TGUID;
; j0 @+ N' {5 `8 L" m; r - dwClsCtx: DWORD;9 [1 c' @1 w4 d7 h6 I0 v
- pActivationParams: PInteger ;4 _0 d) ?0 A1 X# x6 S/ U
- out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;
0 l+ a2 K4 L1 \) t - Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;$ _: x5 T7 |& s+ q* d; c2 o
- Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;3 `, k1 N" T, O, J8 h! [
- Function GetState(out State :Integer): Hresult; stdcall;
5 U$ z3 `/ u* y3 A- }4 O1 U+ \
5 f" ~) \; X/ ~+ F% x0 F; E: B8 ~- end;
: t6 D- [8 q6 k$ G
! G- T7 C& f. E: ]# I
2 z0 T* [ i- i$ o/ |- IMMDeviceCollection = interface(IUnknown)7 Q/ x$ K3 c* J% W4 S4 y1 a
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
6 ^3 A X' o8 d- ^7 M - end;) T# e- S: K$ X$ e$ d6 Q) ^, v! E
- ' V- j$ C' I, A. C& ]2 g
- IMMNotificationClient = interface (IUnknown)
! N3 X8 s: [0 }2 ?8 {/ k - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
* s. o; }* E' A6 w! G5 D - end;
8 I/ r, G N- M
1 `: ]4 d0 I- r" u# T4 B- IMMDeviceEnumerator = interface(IUnknown); C' i3 j' ]6 m& K1 a6 }
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']2 E, x5 I0 Z9 I: x @
- Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;
. z! f3 ^- c$ U. c8 k - Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;% G# y, P9 n$ e8 _: k5 O
- Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;+ e" z) G- G; ^+ ?* S1 z! U; @
- Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;
& V J4 m2 r$ g' N9 i+ J E( |. q - end;
5 T- K1 ^* q: z. ]" a7 {. X! \/ L
6 E% z/ Y' L1 N4 R& P- implementation) v( m( m) Q( U* n( n* q
- end.
% d5 _+ `3 s r; K) A
; O( b$ q2 L7 U/ _4 G! h- Thanks & Reagrds,
( t. x- J) G$ j. C& z; s& H - Mukta ...& E+ U6 h7 ^- p* b5 }
复制代码
- _5 ]0 N( @& e! w- it's work in Delphi 7* o4 B1 f) Z$ a
- //////////////////////////. Z7 ?$ F" o9 L
; _- Q. h& W, y/ D- unit MMDevApi;* Q% M I5 l5 A/ R8 d
- " w& C+ `1 J' U
- interface. }# _3 Z: s7 l/ W; y: }2 a
" ]( H# Z5 N2 z( l/ w# Z% a5 t/ W- uses
' v* ?6 u, A, ?' E5 Z - Windows, ActiveX, ComObj;: u& M( W$ l: x) R
1 C' _. p* I2 W( P- const1 D0 s! B/ f/ o( k9 ` \
- CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';$ u; o7 Z3 |5 S R+ k
- IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
" o. @8 k! C: d/ u6 X - IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';% O* K. n9 o& m* y
- IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
' C# X& S# n& E8 X, d0 \ - IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';2 E. h, P& T8 R
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';% @" l9 H; k9 j' ?9 g8 @
- IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
+ e/ V# a- L! m+ }
3 r" p& y. n: v6 ` J! m- DEVICE_STATE_ACTIVE = $00000001;& q9 A+ Q8 y) r1 [, t. f: F
- DEVICE_STATE_UNPLUGGED = $00000002;. i- o5 v* O+ T* K) E" i/ Z
- DEVICE_STATE_NOTPRESENT = $00000004;% v/ J- W% f# ]0 j4 N
- DEVICE_STATEMASK_ALL = $00000007;
. \2 ?- `, b) N" D. ], s& r! @
' }! I. Z, Q9 Z7 O2 a- type0 J4 o; o& O# H5 ?4 H, q- D
- EDataFlow = TOleEnum;
+ Y. u* i3 _7 i$ ~- [ - & n8 J% |. M. w
- const
; u8 d2 G. t4 @9 P; r - eRender = $00000000;
2 `" \2 p3 s, X2 i - eCapture = $00000001;
" l' u% t7 _. e/ ? h6 P - eAll = $00000002;) D& H( D. i( c, x, F
- EDataFlow_enum_count = $00000003;
8 U X# ]& p2 |/ t# @ A - / c4 R h) s8 l# h" i! M8 ~
- type
1 |$ E5 L: y; v5 s" \! {1 S* [ - ERole = TOleEnum;
: h3 W- m6 u# m2 C, R; B8 q - 7 _' u1 { ?6 c- {) g
- const
) i. R, H6 g2 X- O$ B" G- H - eConsole = $00000000;
- F& _! r6 P& I* H - eMultimedia = $00000001;) }3 B' x+ p, I4 P* `! {$ e# u
- eCommunications = $00000002;9 M8 |* ?: j6 M+ ?7 Q
- ERole_enum_count = $00000003;
+ Q+ o* W! m6 y* r
6 j9 D/ J( _9 O/ ^7 j4 X- type& x5 k$ m8 z) t6 b& e
- IAudioEndpointVolumeCallback = interface(IUnknown)
" O0 Q: Z6 E8 K0 M - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']: R4 b. d: W! t, o3 {* R: v
- end;
# {+ ^' g" N4 ^' k0 U6 L - 8 x: N8 l' Y; ?) l
- IAudioEndpointVolume = interface(IUnknown)" Y4 O1 x( [( e; I
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']7 f) x- V: j9 [+ F6 \$ m; u
- function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
1 t. t6 g% I: ]. j8 U/ L - function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
0 C J/ O6 U. P- V" z& R4 J - function GetChannelCount(out PInteger): Integer; stdcall;7 I" U# c6 G1 c8 f
- function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;5 c. ?; L( U& L& c5 _
- function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
3 e; d; c& ]" W' C - function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;
2 j) z/ ]" F, x- X- L( ]/ h - function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;# A4 g; h% Q! U4 H' F0 z
- function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;$ \9 Q/ q# Y2 x1 e/ p, g$ e( y
- function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;' J+ C$ i9 Y A' A( {, y* k
- function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;( Q+ E" K- t. R6 K3 ~ e8 z/ ?; d
- function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;2 C& E# Z" L) v: _+ h- Q" B
- function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;3 T/ M" ~; ? r+ u( [# I0 c" S) j
- function GetMute(out bMute: Boolean): Integer; stdcall;' G3 z0 C) l4 q4 ]/ d4 H. q8 d
- function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;" \, a, y; ^; H+ R) ?* V
- function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;
5 l6 N' m% Z6 n3 U! k - function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;
/ M2 h' K- i5 [+ z6 F9 C( v+ f7 I - function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;& J b# L8 Z' T. v m1 N
- function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
/ Z5 S# l- p- e - end;9 j+ W4 l+ M% v7 _
- 8 y0 O5 \ R8 @7 `; ?$ H
- IAudioMeterInformation = interface(IUnknown)
8 w( y( C; w4 Y7 R( h' S - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']
3 y0 I @- Z" l, X0 p! N - end;
: u6 h( o" G3 L M5 O1 ]! f
- ^/ T6 H% w8 R$ e! Y/ P9 h- IPropertyStore = interface(IUnknown)# @% O# d$ E* \8 y# L! J
- end;
4 M7 T4 x$ ~9 Q1 V
8 T5 w( j% K3 N$ s z6 X- IMMDevice = interface(IUnknown)
4 A/ a/ n: [3 M j" I - ['{D666063F-1587-4E43-81F1-B948E807363F}']
& [! K# f4 k Y1 m# h) O - function Activate(const refId: TGUID;
2 G E8 x) n0 Q - dwClsCtx: DWORD;( M5 ]2 s# S* k; G: z0 Q
- pActivationParams: PInteger;- i$ N9 K, N: w+ Y7 p6 {
- out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;: U+ U$ V* E; V, W
- function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;% q! Z4 f; g5 M/ m0 o
- function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;
7 {0 t. Q" ~- x- g1 e3 b+ V - function GetState(out State: Integer): Hresult; stdcall;
2 o2 i& L9 k# M( t- | - end;
, d2 p# d3 D- M5 w3 o - s& d* b) V4 G. N& b
- % t5 w; Q# @- ^, s7 S+ q5 M i# {5 n
- IMMDeviceCollection = interface(IUnknown)
+ ?% n. I9 T% l5 `' {" |# w1 O! q - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']- @( [. R/ l* w* H' c
- end;
9 |, ]; Q' k! O/ r' e - : F+ F9 [+ b/ G+ c3 |
- IMMNotificationClient = interface(IUnknown)+ ~6 U3 u4 Q# J
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
3 p* B. }" o/ w8 [ - end;
0 }2 ]5 y: _% w7 _
# z( Q P' q% f$ Z( ?+ c- IMMDeviceEnumerator = interface(IUnknown)$ j, l% h! G" R8 x4 v& e# }
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
- w# t8 @' c o" T1 c: Q$ { - function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;+ k1 D0 y" x+ d; H- d. V. l
- function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;
8 W- G+ y% e: F: U% E - function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;
+ J) i2 _4 I/ }5 q - function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;
& L; Z" Y0 i% ~/ h+ N1 a - end;4 _5 M% X/ m$ {5 q0 J
9 a( B" @+ p+ F4 l' e- implementation
" e2 i% _- w) C/ J - 2 O' |, h: Q1 w- Z
- end.
' a3 y6 I4 P; `: P - d. t" h6 @- O) a! P2 `# ^1 T( q, M
- ///////////////////////
7 _) u* ]! E" A0 D+ M8 w1 J& Z - simple sample :)( f+ g2 F! p, W9 z5 K6 x* X+ i! h
- ///////////////////////
6 d" }3 ^* H: v4 }+ R9 o1 v - 7 ?4 M9 d9 m3 W& C. l0 Y
- //...... other code
4 E6 ]' Y" A% O" P# w ? - 9 @! C. F1 d7 W9 w3 C
- uses ... ActiveX, MMDevApi, ...;/ q5 x- Y9 u9 C# v
- ( g! f7 u2 y/ M. _; r& I
- //...... other code
5 U9 D Z3 _2 z5 U& l/ ` - W2 D! B X0 v$ a
- var
; `- R/ H0 ^2 v8 ^4 a, D' T) {' W - endpointVolume: IAudioEndpointVolume = nil;
; _! ^5 o2 Z7 S1 \* C; T - ! d" a) i2 x4 N+ z4 G# s8 n
- procedure TForm1.FormCreate(Sender: TObject);
' _& |4 `9 e8 O( V+ h' X1 W - var
# c7 i( Q: V% G; h: g - deviceEnumerator: IMMDeviceEnumerator;
6 X$ r5 D# K: @ - defaultDevice: IMMDevice;
7 @+ k- H' y& ] t6 o - begin: I8 @* p% U6 v5 S" ]
- CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);0 Q- S+ W8 C) Z
- deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
- C5 }& x+ ^1 ]% C# G- o - defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);
% ^6 d9 a% t6 i6 F. g& Y7 X - end;
* E6 S3 }3 e" w$ ^2 A& S+ A, y
* b+ m# {2 b* p7 v% A- procedure TForm1.Button1Click(Sender: TObject);
4 n* X6 O, C7 \0 T/ F" S - var: _8 s; }9 c. _3 O$ ^2 {
- VolumeLevel: Single;6 l7 J% v A( F4 Q t
- begin
( a+ R" }- {) R; D6 o2 V - if endpointVolume = nil then Exit;; c& b7 m6 g4 C% S. Z$ S2 q& [3 R
- VolumeLevel := 0.50;) _, _0 A' z ~, E! t
- endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);
( r) t& a# x4 m& b/ d - Caption := Format('%1.8f', [VolumeLevel])
% e2 _0 U5 a3 f) X1 f* v - end;
8 B2 K6 p3 k7 @. ~# J6 X/ V D - V: u+ \+ P9 H$ R. ~& q O/ G; ]- m) d
- /////////////////////////////////////% i- L: v& _7 g) E
- 8 _, I" r8 z# K# t- W1 ~ Y
- // with best regards ToxicDream
/ ?" Y6 W0 ]3 {) U% ?1 P
复制代码 |
|