找回密码
 注册
搜索
查看: 4804|回复: 0

常用数据类型使用转换详解

[复制链接]
发表于 2003-10-19 13:17:07 | 显示全部楼层 |阅读模式
作者:程佩君
8 x, c5 Q8 ^) G: d# @$ s1 l7 O. Z% ?! |5 U( i" ^  o2 z8 Z& O+ c
刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用数据类型的使用。
0 y0 N( t; }8 c' O( s2 {  Q( T  r$ Q5 u/ T/ B9 I6 ~
我们先定义一些常见类型变量借以说明, G  F. j6 m+ h# F- u; F

" @2 s1 |2 b/ b) [int i = 100;
2 g# g( V- d2 ^( qlong l = 2001;
+ m# A* z; n/ X' X' Kfloat f=300.2;( W! A$ A# x4 e( o$ h4 M8 l) e' G1 C
double d=12345.119;
" I2 l3 n3 o. ^* }char username[]="程佩君";% j& f% b% I: S, I  Y4 i
char temp[200];
& u! H. M  ?, @0 o' t: H, pchar *buf;- X: Q- k9 G, v& s5 C7 K/ N
CString str;" O: H. b. G# G' K7 X( W' L) s1 E
_variant_t v1;1 i' X1 n& T( j0 H7 g8 c; Z% I
_bstr_t v2;
$ O5 }. Z: R5 h' x/ R/ M$ z* x% d+ X! m+ i3 g( ?
一、其它数据类型转换为字符串& l1 D3 {4 A. ~7 B8 b4 F2 |$ g

4 @6 i7 n/ r9 m% p& \, ^7 P+ h
  [' e4 _) L7 y' m5 Z) R* W8 H2 t短整型(int)
  N' O! Y/ X  o. W# fitoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制4 X- w6 y) e& y" s- K$ ^* T
itoa(i,temp,2); ///按二进制方式转换 & m' I) G$ Z% C0 t2 Y
长整型(long)" _7 n4 {5 U* ]: |
ltoa(l,temp,10);
0 y7 h' C" [3 S. A% d9 n浮点数(float,double)$ `9 Y1 y; \; k  J1 P  n  L: q/ P
用fcvt可以完成转换,这是MSDN中的例子:
) H5 R& _4 f8 D# r1 `int decimal, sign;
; M& m, p! C$ ?+ Q% k- ?char *buffer; / F; R# h' C0 J- F
double source = 3.1415926535; ) M6 q- k5 ^1 s5 s
buffer = _fcvt( source, 7, &decimal, &sign );
1 R9 @  G- L8 a& T% d3 B& ^运行结果:source: 3.1415926535 buffer: '31415927' decimal: 1 sign: 0
6 T% Z5 \/ }' y1 o: rdecimal表示小数点的位置,sign表示符号:0为正数,1为负数
8 N7 [- ~. M, w$ C" p: H  fCString变量) M$ X, g: F; [* ]& v0 z8 N
str = "2008北京奥运";
* h% Y% D; V, q) H/ A8 K1 x1 |8 Ebuf = (LPSTR)(LPCTSTR)str; 8 s" }& l; r. q" e9 t
BSTR变量; N# B8 o# I7 a5 f* e! @' n0 v. Y
BSTR bstrValue = ::SysAllocString(L"程序员");
, E* a, ^  n+ ~* \  rchar * buf = _com_util::ConvertBSTRToString(bstrValue); ; A) R2 h8 {* G
SysFreeString(bstrValue); 0 {& g: J- r4 U& w2 @/ o6 s2 w, T* Y
AfxMessageBox(buf); 4 W8 `  e6 T5 g% K( Z3 S0 Q
delete(buf); ' F9 u9 F, |8 }
CComBSTR变量# M& j3 r- [# a, v
CComBSTR bstrVar("test"); " X$ M: y4 }* ?6 T  @% C2 N
char *buf = _com_util::ConvertBSTRToString(bstrVar.m_str); 9 G1 x4 a2 F7 l# y" G& Q
AfxMessageBox(buf);
% Q& A7 Y+ x9 I& fdelete(buf);
! w/ L/ F$ R  M7 I& Q* i) `3 q' ^- t- X& ~
_bstr_t变量
# L3 ~6 b3 o  a1 U9 @/ T" `/ I_bstr_t类型是对BSTR的封装,因为已经重载了=操作符,所以很容易使用4 m2 Z( ^7 M! P% y
_bstr_t bstrVar("test");
5 O- K, F! r( ?; i  A+ Jconst char *buf = bstrVar;///不要修改buf中的内容 7 g* F) L# R$ z+ I5 N2 w
AfxMessageBox(buf);
) m5 p# p- s+ `3 J9 u3 E, i& O7 c
+ N/ k) p$ ^3 {  t
' o$ w0 Y1 e" W: R8 e通用方法(针对非COM数据类型)1 f  h! M. c( e
用sprintf完成转换
; e  x; r$ F. t$ _* M0 T' Y. achar  buffer[200];% G1 Q2 u, q7 h( T4 ~# d; Z
char  c = '1';5 L3 }  p( C2 j% Z
int   i = 35;
  A; u3 G4 G! v$ xlong  j = 1000;; k7 W$ E/ p, p# }
float f = 1.7320534f;
2 d6 A3 G# r8 @: g: I& wsprintf( buffer, "%c",c);, ~5 N$ y! e2 a& p
sprintf( buffer, "%d",i);
- x7 n- `( m7 f% Z5 L7 Y& ?! gsprintf( buffer, "%d",j);
& d3 l( x5 t  L& c+ xsprintf( buffer, "%f",f);
* p9 R3 U6 z; u% O
6 Z# I+ N) [& _. m9 p二、字符串转换为其它数据类型. M* m  n: t% w
strcpy(temp,"123");
0 g1 k$ W& i) i9 B  J
4 k. q3 U) e7 Y9 Y) K9 H6 z短整型(int)0 r. O$ v4 y: b( v: A& a5 D
i = atoi(temp); 3 J  ?0 q8 H9 t! g  C, [8 ]
长整型(long)* w9 g; ^+ ~' V
l = atol(temp);
  O. M$ ]) x3 a2 ?; l0 }9 m浮点(double)2 g: {. N& R$ o) B4 u/ M2 ]
d = atof(temp);
; f% V: N+ u0 jCString变量) X( Y3 J; `/ @# ?! U
CString name = temp;
& w6 r/ S( v2 ?; a7 V, TBSTR变量
3 Z* n  H" S! w6 j& L9 }! s3 gBSTR bstrValue = ::SysAllocString(L"程序员");
, V$ d  R) d2 s/ `" g' Y7 b5 ?...///完成对bstrValue的使用
/ d  N, w. O3 f3 E% \SysFreeString(bstrValue); , S6 F# \. n5 C% i4 c+ W$ v& X

8 X/ @" n* }- X- L' yCComBSTR变量
6 i4 }2 D8 s8 W/ Q& [CComBSTR类型变量可以直接赋值/ p1 S$ D' y0 R4 g9 c1 c2 d# C0 h$ k
CComBSTR bstrVar1("test");
. |( k/ j! ~% SCComBSTR bstrVar2(temp);. T! y) w5 q1 n2 j- N$ E8 T; \, A

- a: ^  i3 V, l' f2 V* X8 E_bstr_t变量
1 I& n4 Y5 Q0 k7 j8 j0 [% u8 i_bstr_t类型的变量可以直接赋值  F* f! W6 ^$ A9 o% p' n8 ?# C8 k
_bstr_t bstrVar1("test");
1 o5 ^& z+ o/ p/ v9 \2 @3 {; c_bstr_t bstrVar2(temp);
: Z9 E: E& d1 ]! r
# N( i8 q; }6 k7 o0 j& m3 A; F: b& _  j% A% L
三、其它数据类型转换到CString
3 P- S7 R1 h& v. X) u. f8 m使用CString的成员函数Format来转换,例如:
8 M* N( O( l+ _. H" l) T# P3 a
# X6 L, O% \) Y8 o
8 g3 e# O7 o0 ~: y3 w  Q+ j6 k整数(int)
' T% D% n" s. @2 Estr.Format("%d",i);
& k2 N) \1 S! w* d. y/ C$ c浮点数(float)
4 D' m% W- x/ e! P+ U3 hstr.Format("%f",i); 1 x& r! u6 \) \' m! i2 H  }7 C8 I
字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值
) L& A3 @4 S+ {. A9 M  nstr = username;
! n, @: {  S5 Z! o% N对于Format所不支持的数据类型,可以通过上面所说的关于其它数据类型转化到char *的方法先转到char *,然后赋值给CString变量。
% l2 v, s1 t3 f$ |* E. w+ S( l; n3 B* g! U/ j; h$ A
四、BSTR、_bstr_t与CComBSTR
' i& R8 R% U& o* h8 `( N7 _! q, S. B  P6 N, J! p7 k5 Y( z

5 c5 i% C; ^' |( V1 BCComBSTR 是ATL对BSTR的封装,_bstr_t是C++对BSTR的封装,BSTR是32位指针,但并不直接指向字串的缓冲区。
7 T( _2 a- [6 Q" Y" d  o* d7 Uchar *转换到BSTR可以这样: ) Y0 Q* t# ?4 w. N9 k7 I
BSTR b=_com_util::ConvertStringToBSTR("数据");///使用前需要加上comutil.h和comsupp.lib( ]4 d; F9 f! ~& L' F7 j. W
SysFreeString(bstrValue);
1 Y/ e& U5 A# p" z) m+ }9 e反之可以使用
" x/ w! i4 J2 ?- p# n3 G5 {char *p=_com_util::ConvertBSTRToString(b);3 M$ V) y5 \' P8 b; v+ a
delete p;% U, A  B% w% `+ t
具体可以参考一,二段落里的具体说明。
9 X2 o9 s* B8 j- ~3 N9 z
6 b# L+ m" Q, H! n5 NCComBSTR与_bstr_t对大量的操作符进行了重载,可以直接进行=,!=,==等操作,所以使用非常方便。+ k2 z  q3 l7 p* T
特别是_bstr_t,建议大家使用它。
1 p9 `. L3 R! P+ p, `' `4 t. r/ m1 ^: e: S

; E/ {# m; l) u0 S* |2 L1 p五、VARIANT 、_variant_t 与 COleVariant* Z$ @3 I* [6 d8 |: M9 F/ W3 ?! o6 H0 ?
  P( N; f  w" W

* X% w; Q# j+ c# K* X2 oVARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。
  |! v: i9 q: G) F. o& ~$ U对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:/ n/ e! c  y3 ~. Y* |0 F) E( _& E) k
VARIANT va;
) g. E' Q, @3 i. ^int a=2001;
$ B- e* G, c' _/ h, `- B* n1 J7 rva.vt=VT_I4;///指明整型数据1 z* [8 u' l) |$ ~9 ~
va.lVal=a; ///赋值7 M5 O/ w4 K9 K6 z7 a, e

. f& d  ~- M8 c  {3 o. k. i对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:
. y; P3 m4 C3 c+ K) U8 h$ K) o
: @: B- [8 O9 `% N0 H, @- FByte bVal;  // VT_UI1.
7 ~# o( i' Y' {- G7 K4 H9 o9 zShort iVal;  // VT_I2. ) W3 T% n4 J9 ~& q- v
long lVal;  // VT_I4. + h. z6 i# r' U, ]
float fltVal;  // VT_R4. 4 B6 g3 d4 i' z* A" Q- _6 D
double dblVal;  // VT_R8.
2 U# [' a0 @7 K5 EVARIANT_BOOL boolVal;  // VT_BOOL.
' e  g& E" q4 _. Q& Y4 SSCODE scode;  // VT_ERROR. ) s& l) h+ a/ I! r, `
CY cyVal;  // VT_CY.
. M) x' }; S: l: pDATE date;  // VT_DATE.
$ \/ m) H. c' t3 zBSTR bstrVal;  // VT_BSTR. / H+ `7 {" A6 `8 `% _
DECIMAL FAR* pdecVal  // VT_BYREF|VT_DECIMAL.
: k- f1 p: C* k3 BIUnknown FAR* punkVal;  // VT_UNKNOWN.
, t6 ^: |' h+ |# a! L! yIDispatch FAR* pdispVal;  // VT_DISPATCH.   B. K% [; E0 t8 w
SAFEARRAY FAR* parray;  // VT_ARRAY|*. 5 z8 L: }. G+ B9 s1 s$ K1 X* e$ m
Byte FAR* pbVal;  // VT_BYREF|VT_UI1. 8 p/ @, o0 a' M% `% q
short FAR* piVal;  // VT_BYREF|VT_I2. " G: C: ^! Z  M/ B3 n3 {
long FAR* plVal;  // VT_BYREF|VT_I4. 4 ]+ P. B& j% T9 a5 d
float FAR* pfltVal;  // VT_BYREF|VT_R4. 1 V( `0 h! Y$ E) u: R. k. r* X, ?) d
double FAR* pdblVal;  // VT_BYREF|VT_R8. 9 m1 G- h9 J- R# `* R* i
VARIANT_BOOL FAR* pboolVal;  // VT_BYREF|VT_BOOL. ! _( {1 X* o& r  w. J, b
SCODE FAR* pscode;  // VT_BYREF|VT_ERROR.
# A# W3 O. m8 lCY FAR* pcyVal;  // VT_BYREF|VT_CY. % Z0 d2 }! \( J7 L
DATE FAR* pdate;  // VT_BYREF|VT_DATE.   f# z' P# j, B0 S% [
BSTR FAR* pbstrVal;  // VT_BYREF|VT_BSTR.
# F# F! K# B( d9 }+ ZIUnknown FAR* FAR* ppunkVal;  // VT_BYREF|VT_UNKNOWN. 8 g9 n' n) z) S  Y/ ]/ ?/ H/ m) b
IDispatch FAR* FAR* ppdispVal;  // VT_BYREF|VT_DISPATCH. 3 s: y, g1 @4 M6 `% K  d4 Y- _- L$ P
SAFEARRAY FAR* FAR* pparray;  // VT_ARRAY|*.
  u; q. g; u) ^2 [. a9 c; L) vVARIANT FAR* pvarVal;  // VT_BYREF|VT_VARIANT. / ]: U) d' d$ K$ {( |* Y
void FAR* byref;  // Generic ByRef.
' O! l6 V$ U& Vchar cVal;  // VT_I1. $ J5 Z3 D) y  K/ w2 V, m
unsigned short uiVal;  // VT_UI2. 9 H# v8 D0 p1 p2 Y" Y
unsigned long ulVal;  // VT_UI4. ' B1 S5 }/ z8 I2 d3 c& {
int intVal;  // VT_INT. $ M9 A5 `2 G& ~" y* N
unsigned int uintVal;  // VT_UINT.
( E* g5 ^: K6 ]9 xchar FAR * pcVal;  // VT_BYREF|VT_I1. - Z+ M6 e/ H: ]* q3 a2 w# V1 r
unsigned short FAR * puiVal;  // VT_BYREF|VT_UI2. 7 H4 I( l. `, Q9 e
unsigned long FAR * pulVal;  // VT_BYREF|VT_UI4. - K" `! m- N6 i& |, J
int FAR * pintVal;  // VT_BYREF|VT_INT.
% s* {% h1 c% _0 g, w) nunsigned int FAR * puintVal;  //VT_BYREF|VT_UINT. % [- i  S; G; g* w+ b
( \+ o$ n0 ^8 s5 T

1 g) {. }9 n: x% J  F  B_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。- f. l  n  G. K" S* T" O3 O  ]
使用时需加上#include <comdef.h>1 a* F! v' F# u9 O
例如:" }' r& ?& F% c+ b* @6 D$ O( V8 C8 S
long l=222;
) ?$ c# |1 w  K- X, |" H8 [8 x! xing i=100;; T  O* z3 J/ j
_variant_t lVal(l);
5 `% A, I. F# \: AlVal = (long)i;
. n2 e5 o" y/ B6 {8 ~, w8 V" A  W4 V( }+ K, a. A  D6 W, C

( g9 R, U3 [6 X& E/ dCOleVariant的使用与_variant_t的方法基本一样,请参考如下例子:
) e7 a8 o( J9 k) U/ X  Q+ l) j; QCOleVariant v3 = "字符串", v4 = (long)1999;
. }5 C( ?8 w$ e" ?5 m5 FCString str =(BSTR)v3.pbstrVal;
  s; m3 t8 d. |" T6 q9 w% Plong i = v4.lVal;
% t$ R7 R& q. K+ M6 w( E
" `. B: ^2 ?# I2 E' K
4 j0 d8 G: X- k1 j1 H, u7 H9 H六、其它一些COM数据类型
/ p) K5 O4 g# t/ J8 I3 _5 d8 ]* x: b3 V) H: m- ?. A
根据ProgID得到CLSID
5 F; i$ S5 y; f2 O9 z8 THRESULT CLSIDFromProgID( LPCOLESTR lpszProgID,LPCLSID pclsid);
! {% ^+ ]' F0 J' y4 O2 z5 ACLSID clsid;
1 W2 \  x, t) R. A% X( p0 _6 dCLSIDFromProgID( L"MAPI.Folder",&clsid);) O" [1 p& O; z3 ~
- b1 o1 G6 V3 t" [: c9 ^
根据CLSID得到ProgID
% j) G2 n/ M+ H/ [  q, |( l' K. gWINOLEAPI ProgIDFromCLSID( REFCLSID clsid,LPOLESTR * lplpszProgID);
; x  D% e( b! Q  s: U6 l例如我们已经定义了 CLSID_IApplication,下面的代码得到ProgID; _2 o1 g/ g. i7 y
LPOLESTR pProgID = 0;
8 F( ~  W9 N  f1 QProgIDFromCLSID( CLSID_IApplication,&pProgID);- V2 a# d. M! h6 p) P5 a' o
...///可以使用pProgID 9 B3 _; T- k3 Q
CoTaskMemFree(pProgID);//不要忘记释放 ' l6 o0 t, j! t( A( d) K1 r9 O* R8 V
  A3 N: [4 R! f. F+ F1 i4 i0 |
七、ANSI与Unicode1 T% r' F$ a: @- k0 y: q4 b# u
Unicode称为宽字符型字串,COM里使用的都是Unicode字符串。
; {# _: t  C) n! r  U& Y' B8 I
# C$ M% ~' {3 \" L, l* q5 d将ANSI转换到Unicode% [9 t' M$ O/ ^- q$ p& m# z$ @
(1)通过L这个宏来实现,例如: CLSIDFromProgID( L"MAPI.Folder",&clsid);- W: H4 N7 e, \* W3 g
(2)通过MultiByteToWideChar函数实现转换,例如:
( h. ~0 l( `  P8 R. ochar *szProgID = "MAPI.Folder";
5 `* T) N8 ~# U9 p! H% v1 Y% uWCHAR szWideProgID[128];) N  `- o  S4 f! g" v
CLSID clsid;3 M1 d1 V' n/ E$ ^/ e: I
long lLen = MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID));6 ~, z) \& F. G; c! z4 Z) I) B
szWideProgID[lLen] = '\0';
- \+ v$ C5 ~0 C, C(3)通过A2W宏来实现,例如: : d8 C: [; t- u, w6 r9 O
USES_CONVERSION; 4 @) U6 K( O" C! M# \9 v
CLSIDFromProgID( A2W(szProgID),&clsid);
, v6 }+ F/ S2 r1 E1 q/ D将Unicode转换到ANSI
4 j+ T2 y! C+ H9 x, |( W( j3 Y(1)使用WideCharToMultiByte,例如:; I+ @' k" S9 ?
// 假设已经有了一个Unicode 串 wszSomeString... & }" O) a. n+ `$ J
char szANSIString [MAX_PATH]; 3 Q7 o& Y8 z$ h7 ]. ~% W9 M
WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, sizeof(szANSIString), NULL, NULL ); ; e# I. r/ w! |* K& P" j
(2)使用W2A宏来实现,例如:1 Q( y/ E; v1 ?! ~
USES_CONVERSION;
; U( ^7 p0 C  f7 _! PpTemp=W2A(wszSomeString); / y  m1 t/ |. Y; {3 \. p
八、其它7 u  \" q$ L5 k8 h
- T! L! t+ s7 R' u7 t3 ^6 H1 t, y/ Q( G. e6 ]
对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如:3 K3 j2 g5 Q5 @
LPARAM lParam;
( F) D0 z; x( g6 Y0 y9 L+ _' B0 IWORD loValue = LOWORD(lParam);///取低16位2 ^$ J3 m! c% @' Q
WORD hiValue = HIWORD(lParam);///取高16位
+ J5 O7 ]: p; ?$ a8 j" L4 }3 s( {
# ~7 g. h4 j$ K' E) k% J, Z0 }  U* U
对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如:
# P: m, _1 E8 H3 `, w7 F0 I" {3 W# O0 fWORD wValue;. m; Z1 z' M) Q4 H( J
BYTE loValue = LOBYTE(wValue);///取低8位+ p# w6 P9 L, B: h& D: z% G
BYTE hiValue = HIBYTE(wValue);///取高8位
& \% i6 S7 K0 _7 z" g2 @$ ?+ E
$ X9 q* l% S, f
; R. S" v, s% y4 _两个16位数据(WORD)合成32位数据(DWORD,LRESULT,LPARAM,或WPARAM)
7 X( c. X5 l+ i; b4 |5 CLONG MAKELONG( WORD wLow, WORD wHigh );# ]+ }& i  [* S- x
WPARAM MAKEWPARAM( WORD wLow, WORD wHigh ); / ]9 \: p& ^. R2 f4 B
LPARAM MAKELPARAM( WORD wLow, WORD wHigh );
3 a, a+ j, \$ Z8 DLRESULT MAKELRESULT( WORD wLow, WORD wHigh );
  B9 g  o$ J5 }: w3 T, R( T  D0 u' V) |: W' J$ }2 B

- b, ~6 P9 L# K! j6 v  w两个8位的数据(BYTE)合成16位的数据(WORD)# A" z( {% a& O
WORD MAKEWORD( BYTE bLow, BYTE bHigh ); / }- p1 E  t3 Z4 ]# d5 h& A; }* ~

$ ]+ l4 |1 A: P# r0 Y+ N; x7 m& r
从R(red),G(green),B(blue)三色得到COLORREF类型的颜色值9 I% u4 I7 W: l0 ]! T+ `/ w! f0 @
COLORREF RGB( BYTE byRed,BYTE byGreen,BYTE byBlue );1 h# e, y& c: g- j; X3 _
例如COLORREF bkcolor = RGB(0x22,0x98,0x34);" O/ y/ C9 s/ j/ J8 g' e
; z* d: ~) H2 T. f0 G2 f

7 O- Q; O# `: u( N, R# {5 p5 ~) R( {& H从COLORREF类型的颜色值得到RGB三个颜色值
, q' L- }# g  u' p; Q! ?  MBYTE Red = GetRValue(bkcolor); ///得到红颜色
& K3 n4 L- |6 q4 X& h% r3 g0 k% WBYTE Green = GetGValue(bkcolor); ///得到绿颜色
, |& |; r2 @7 S: `BYTE Blue = GetBValue(bkcolor); ///得到兰颜色
' _. w  o& H' F; a
& {( z0 c$ G$ q3 g- q九、注意事项# D0 c/ Z, s8 X5 ]6 K* U' Q6 x& ~
假如需要使用到ConvertBSTRToString此类函数,需要加上头文件comutil.h,并在setting中加入comsupp.lib或者直接加上#pragma comment( lib, "comsupp.lib" )
( m* x, l2 T% P+ r6 T
  A: {( b  L9 Y9 B) R' e- a后记:本文匆匆写成,错误之处在所难免,欢迎指正.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2026-8-13 21:30 , Processed in 0.020995 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表