VC++各种类型之间的转换
int i = 100; long l = 2001; float f=300.2; double d=12345.119; char username[]="程佩君"; char temp[200]; char *buf; CString str; _variant_t v1; _bstr_t v2; 一、其它数据类型转换为字符串 短整型(int) itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制 itoa(i,temp,2); ///按二进制方式转换 长整型(long) ltoa(l,temp,10); 浮点数(float,double) 用fcvt可以完成转换,这是MSDN中的例子: int decimal, sign; char *buffer; double source = 3.1415926535; buffer = _fcvt( source, 7, &decimal, &sign ; 运行结果:source: 3.1415926535 buffer: '31415927' decimal: 1 sign: 0 decimal表示小数点的位置,sign表示符号:0为正数,1为负数 CString变量 str = "2008北京奥运"; buf = (LPSTR)(LPCTSTR)str; BSTR变量 BSTR bstrValue = ::SysAllocString(L"程序员"; char * buf = _com_util::ConvertBSTRToString(bstrValue); SysFreeString(bstrValue); AfxMessageBox(buf); delete(buf); CComBSTR变量 CComBSTR bstrVar("test"; char *buf = _com_util::ConvertBSTRToString(bstrVar.m_str); AfxMessageBox(buf); delete(buf); _bstr_t变量 _bstr_t类型是对BSTR的封装,因为已经重载了=操作符,所以很容易使用 _bstr_t bstrVar("test"; const char *buf = bstrVar;///不要修改buf中的内容 AfxMessageBox(buf); 通用方法(针对非COM数据类型) 用sprintf完成转换 char buffer[200]; char c = '1'; int i = 35; long j = 1000; float f = 1.7320534f; sprintf( buffer, "%c",c); sprintf( buffer, "%d",i); sprintf( buffer, "%d",j); sprintf( buffer, "%f",f); 二、字符串转换为其它数据类型 strcpy(temp,"123"; 短整型(int) i = atoi(temp); 长整型(long) l = atol(temp); 浮点(double) d = atof(temp); CString变量 CString name = temp; BSTR变量 BSTR bstrValue = ::SysAllocString(L"程序员"; ...///完成对bstrValue的使用 SysFreeString(bstrValue); CComBSTR变量 CComBSTR类型变量可以直接赋值 CComBSTR bstrVar1("test"; CComBSTR bstrVar2(temp); _bstr_t变量 _bstr_t类型的变量可以直接赋值 _bstr_t bstrVar1("test"; _bstr_t bstrVar2(temp); 三、其它数据类型转换到CString 使用CString的成员函数Format来转换,例如: 整数(int) str.Format("%d",i); 浮点数(float) str.Format("%f",i); 字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值 str = username; 对于Format所不支持的数据类型,可以通过上面所说的关于其它数据类型转化到char *的方法先转到char *,然后赋值给CString变量。 四、BSTR、_bstr_t与CComBSTR CComBSTR 是ATL对BSTR的封装,_bstr_t是C++对BSTR的封装,BSTR是32位指针,但并不直接指向字串的缓冲区。 char *转换到BSTR可以这样: BSTR b=_com_util::ConvertStringToBSTR("数据";///使用前需要加上comutil.h和comsupp.lib SysFreeString(bstrValue); 反之可以使用 char *p=_com_util::ConvertBSTRToString(b); delete p; 具体可以参考一,二段落里的具体说明。 CComBSTR与_bstr_t对大量的操作符进行了重载,可以直接进行=,!=,==等操作,所以使用非常方便。 特别是_bstr_t,建议大家使用它。 五、VARIANT 、_variant_t 与 COleVariant VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。 对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子: VARIANT va; int a=2001; va.vt=VT_I4;///指明整型数据 va.lVal=a; ///赋值 对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系: Byte bVal; // VT_UI1. Short iVal; // VT_I2. long lVal; // VT_I4. float fltVal; // VT_R4. double dblVal; // VT_R8. VARIANT_BOOL boolVal; // VT_BOOL. SCODE scode; // VT_ERROR. CY cyVal; // VT_CY. DATE date; // VT_DATE. BSTR bstrVal; // VT_BSTR. DECIMAL FAR* pdecVal // VT_BYREF|VT_DECIMAL. IUnknown FAR* punkVal; // VT_UNKNOWN. IDispatch FAR* pdispVal; // VT_DISPATCH. SAFEARRAY FAR* parray; // VT_ARRAY|*. Byte FAR* pbVal; // VT_BYREF|VT_UI1. short FAR* piVal; // VT_BYREF|VT_I2. long FAR* plVal; // VT_BYREF|VT_I4. float FAR* pfltVal; // VT_BYREF|VT_R4. double FAR* pdblVal; // VT_BYREF|VT_R8. VARIANT_BOOL FAR* pboolVal; // VT_BYREF|VT_BOOL. SCODE FAR* pscode; // VT_BYREF|VT_ERROR. CY FAR* pcyVal; // VT_BYREF|VT_CY. DATE FAR* pdate; // VT_BYREF|VT_DATE. BSTR FAR* pbstrVal; // VT_BYREF|VT_BSTR. IUnknown FAR* FAR* ppunkVal; // VT_BYREF|VT_UNKNOWN. IDispatch FAR* FAR* ppdispVal; // VT_BYREF|VT_DISPATCH. SAFEARRAY FAR* FAR* pparray; // VT_ARRAY|*. VARIANT FAR* pvarVal; // VT_BYREF|VT_VARIANT. void FAR* byref; // Generic ByRef. char cVal; // VT_I1. unsigned short uiVal; // VT_UI2. unsigned long ulVal; // VT_UI4. int intVal; // VT_INT. unsigned int uintVal; // VT_UINT. char FAR * pcVal; // VT_BYREF|VT_I1. unsigned short FAR * puiVal; // VT_BYREF|VT_UI2. unsigned long FAR * pulVal; // VT_BYREF|VT_UI4. int FAR * pintVal; // VT_BYREF|VT_INT. unsigned int FAR * puintVal; //VT_BYREF|VT_UINT. _variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。 使用时需加上#include <comdef.h> 例如: long l=222; ing i=100; _variant_t lVal(l); lVal = (long)i; COleVariant的使用与_variant_t的方法基本一样,请参考如下例子: COleVariant v3 = "字符串", v4 = (long)1999; CString str =(BSTR)v3.pbstrVal; long i = v4.lVal; 六、其它一些COM数据类型 根据ProgID得到CLSID HRESULT CLSIDFromProgID( LPCOLESTR lpszProgID,LPCLSID pclsid); CLSID clsid; CLSIDFromProgID( L"MAPI.Folder",&clsid); 根据CLSID得到ProgID WINOLEAPI ProgIDFromCLSID( REFCLSID clsid,LPOLESTR * lplpszProgID); 例如我们已经定义了 CLSID_IApplication,下面的代码得到ProgID LPOLESTR pProgID = 0; ProgIDFromCLSID( CLSID_IApplication,&pProgID); ...///可以使用pProgID CoTaskMemFree(pProgID);//不要忘记释放 七、ANSI与Unicode Unicode称为宽字符型字串,COM里使用的都是Unicode字符串。 将ANSI转换到Unicode (1)通过L这个宏来实现,例如: CLSIDFromProgID( L"MAPI.Folder",&clsid); (2)通过MultiByteToWideChar函数实现转换,例如: char *szProgID = "MAPI.Folder"; WCHAR szWideProgID[128]; CLSID clsid; long lLen = MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID)); szWideProgID[lLen] = '\0'; (3)通过A2W宏来实现,例如: USES_CONVERSION; CLSIDFromProgID( A2W(szProgID),&clsid); 将Unicode转换到ANSI (1)使用WideCharToMultiByte,例如: // 假设已经有了一个Unicode 串 wszSomeString... char szANSIString [MAX_PATH]; WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, sizeof(szANSIString), NULL, NULL ; (2)使用W2A宏来实现,例如: USES_CONVERSION; pTemp=W2A(wszSomeString); 八、其它 对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如: LPARAM lParam; WORD loValue = LOWORD(lParam);///取低16位 WORD hiValue = HIWORD(lParam);///取高16位 对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如: WORD wValue; BYTE loValue = LOBYTE(wValue);///取低8位 BYTE hiValue = HIBYTE(wValue);///取高8位 两个16位数据(WORD)合成32位数据(DWORD,LRESULT,LPARAM,或WPARAM) LONG MAKELONG( WORD wLow, WORD wHigh ; WPARAM MAKEWPARAM( WORD wLow, WORD wHigh ; LPARAM MAKELPARAM( WORD wLow, WORD wHigh ; LRESULT MAKELRESULT( WORD wLow, WORD wHigh ; 两个8位的数据(BYTE)合成16位的数据(WORD) WORD MAKEWORD( BYTE bLow, BYTE bHigh ; 从R(red),G(green),B(blue)三色得到COLORREF类型的颜色值 COLORREF RGB( BYTE byRed,BYTE byGreen,BYTE byBlue ; 例如COLORREF bkcolor = RGB(0x22,0x98,0x34); 从COLORREF类型的颜色值得到RGB三个颜色值 BYTE Red = GetRValue(bkcolor); ///得到红颜色 BYTE Green = GetGValue(bkcolor); ///得到绿颜色 BYTE Blue = GetBValue(bkcolor); ///得到兰颜色 九、注意事项 假如需要使用到ConvertBSTRToString此类函数,需要加上头文件comutil.h,并在setting中加入comsupp.lib或者直接加上#pragma comment( lib, "comsupp.lib" 后记:本文匆匆写成,错误之处在所难免,欢迎指正. 关于把BSTR类型数据转换成CString 类型数据时的问题? 当我在把BSTR类型数据转换成CString 或 “char* 类型”数据时,发现在BSTR类型字符串较短的情况下没问题,当较长时就会出现 内存读写错了。(在NT,2000下都测试是这样的。) 根据你所说: 1)字符串指针(char *)等已经被CString构造函数支持的数据类型 可以直接赋值 str = username; 2)当b 为BSTR类型时可以使用 char *p=_com_util::ConvertBSTRToString(b); 于是以下是对的: CString cstr; BSTR bstr; .... cstr=com_util::ConvertBSTRToString(bstr); ... 可是当bstr非常大时(其实,较大时就会)就会出现内存读写错,不知何故。 此外我发现cstr=com_util::ConvertBSTRToString(bstr); 可以简化为 cstr=bstr; 但当bstr较大时同样出现这个问题。 请兄弟帮忙!急。谢谢! 如何转化((list*)fileip.bian)->liang 关于把CString转化成LPCTSTR的问题 作者:jakiesun 发表日期:2001-9-5 20:08:48 我记的我以前写过这样一段代码 void function() { CString str,str1,str2; function((char*)(LPCTSTR)str1); str=str1; ...//调试道此发现str2的值随着str的改变而改变,请问能解释一下为什么,如有回答,请通知 wangshaohong@sohu.com,tx先 } 添加lib支持 作者:磨刀霍霍 发表日期:2001-9-10 11:32:12 如果不添加会产生错误,在setting中加入comsupp.lib或者直接#pragma comment( lib, "comsupp.lib" 微软认为缺省的设置call convention如果不设置成__cdecl也会出现同样的错误。 1。int 转成cstring ?? 回复人: caigzhi(caigzhi) (2001-10-17 11:27:35) 得0分 CString 的成员函数Format() int a = 2131; CString str; str.Format("%d",a); 回复人: tenchi(C与C++之间) (2001-10-17 11:32:12) 得0分 int i=2001; char str[10]; _itoa(i,str,10); CString szString=str; 回复人: fiolin(幽深的水) (2001-10-17 11:45:40) 得0分 他们两个的都可以!! 回复人: sohucsdnvc(thanks) (2001-10-17 13:24:17) 得0分 那如何把double转成cstring 回复人: yihugang(小虎子) (2001-10-17 13:29:15) 得6分 int i = 2131; char *c=new char[20]; CString str; sprintf(c,'%d',i); str=*c; 回复人: Gu_c_h(Gu) (2001-10-17 14:07:17) 得0分 用 _gcvt 下面是 msdn 的例子 Example /* _GCVT.C: This program converts -3.1415e5 * to its string representation. */ #include <stdlib.h> #include <stdio.h> void main( void { char buffer[50]; double source = -3.1415e5; _gcvt( source, 7, buffer ; printf( "source: %f buffer: '%s'\n", source, buffer ; _gcvt( source, 7, buffer ; printf( "source: %e buffer: '%s'\n", source, buffer ; } Output source: -314150.000000 buffer: '-314150.' source: -3.141500e+005 buffer: '-314150.' 回复人: Gu_c_h(Gu) (2001-10-17 14:49:56) 得6分 int a = -3.1415e5; CString str; str.Format("%f",a); 回复人: ruixp(锐剑) (2001-10-17 15:06:48) 得6分 CString 的成员函数Format() int a = 2131; CString str; str.Format("%d",a); 3。如何在CString和double之间转换?要求转换之后能保留小数点,保留正负号?? cstring::format(%.xe) x为精度位 回复人: pchaos(杂讲) (2002-1-28 11:21:46) 得0分 CString str; double db; str = "123.456"; db = atof((LPCTSTR)str); 回复人: hgw111(hg) (2002-1-28 11:52:57) 得0分 CString -> double : atof double ->CString :Format 回复人: pchaos(杂讲) (2002-1-28 13:46:04) 得0分 CString str; double db; str = "123.456"; db = atof((LPCTSTR)str); db = 777.999; str.format("%e", db); 4。字符型要转换成int?? atoi(str) 5。_bstr_t 到 unsigned int?? _bstr_t str; unsigned int Length=6; Length=Length-str.length(); 6。VARIANT类型转换问题? 我在使用MSCOMM中SetOutput()函数时 形参必须为VARIANT变量 如何将其它的数据类型转换为VARIANT类型? 如:Cstring->VARIANT、 *char->VARIANT 我对VARIANT的类型结构体不太熟,请讲详细些(最好有范例),谢谢! 回复贴子: 回复人: vc_xiaoxin(小新) (2001-12-26 15:43:57) 得0分 VARIANT本身是一个复杂的结构,别的数据怎么转呀?关注 回复人: mpg_liu(星仁) (2001-12-27 18:33:50) 得10分 定义一个VARIANT变量后,他应该是一个结构体变量,其中有一个成员是字符型的,给这个成员赋值 回复人: LLnju(LLnju) (2001-12-27 18:36:10) 得0分 实在不清楚嘛就用 _variant_t , COleVariant 这些东东嘛,很好用的啊 回复人: softarts(CDMA2000) (2001-12-27 18:41:32) 得10分 构造一个就行了。 VARIANT varXX; CString strYY; varXX.vt=VT_BSTR; varXX.bstrVal = strYY.allocsysstring(); 应该可以了。 回复人: softarts(CDMA2000) (2001-12-27 18:42:11) 得0分 我也觉得COleVariant要好用一些,呵呵,我都用它。 回复人: bobofu(有问题要问) (2001-12-27 19:32:18) 得10分 CString str; _variant_t var; var = _variant_t(str); 7。COleVarant 如何转换为 CString? CString 如何转换为 char * CString 如何转换为 char[xx] ?? CString 如何转换为 char * wsprintf或者= CString 如何转换为 char[xx] strcpy() 回复人: SecretGarden(天堂鸟) (2002-1-14 11:55:23) 得0分 COleVarant封装了VAREANT类型。 VAREANT类型其实是个巨大地Union,里面自然有你 想要地unsigned char *类型。 CString地GetBuffer和Format可以实现你的后两个问题 8。v_variant_t类型转换成cstring 总提示我cstring未定义 程序如下 _variant_t vfirstname;//存储的是数据库中的数据 CString str;//提示出错 vfirstname=pRs->GetCollect (_variant_t("Phone_Num"); vfirstname.ChangeType (VT_BSTR); str=vfirstname.bstrVal;//提示出错 回复贴子: 回复人: hydnoahark(诺亚方舟) (2001-11-12 11:56:51) 得10分 >>CString str;//提示出错 要求include <afx.h>并且设置Use run-time Library为Multithreaded 回复人: zhengyun_ustc(^-^) (2001-11-12 12:04:39) 得15分 CString未定义,说明你的工程没有引用MFC!! 9。char * 转换为TCHAR类型?? 直接转换,TCHAR相当于char了 char * s; TCHAR * s1=(TCHAR *)s; 回复人: dysxq() (2001-12-21 21:26:25) 得0分 要看你的程序设置是ANSI还是UNICODE, 如果是ANSI,直接转,如果是UNICODE,TCHAR相当于WCHAR, 要用mbstowcsz转一下 回复人: xiaoxiaohan(萧晓寒) (2001-12-21 23:52:17) 得0分 Unicode :宽字节字符集 1. 如何取得一个既包含单字节字符又包含双字节字符的字符串的字符个数? 可以调用Microsoft Visual C++的运行期库包含函数_mbslen来操作多字节(既包括单字节也包括双字节)字符串。 调用strlen函数,无法真正了解字符串中究竟有多少字符,它只能告诉你到达结尾的0之前有多少个字节。 2. 如何对DBCS(双字节字符集)字符串进行操作? 函数 描述 PTSTR CharNext ( LPCTSTR ); 返回字符串中下一个字符的地址 PTSTR CharPrev ( LPCTSTR, LPCTSTR ); 返回字符串中上一个字符的地址 BOOL IsDBCSLeadByte( BYTE ; 如果该字节是DBCS字符的第一个字节,则返回非0值 5. Windows定义的Unicode数据类型有哪些? 数据类型 说明 WCHAR Unicode字符 PWSTR 指向Unicode字符串的指针 PCWSTR 指向一个恒定的Unicode字符串的指针 对应的ANSI数据类型为CHAR,LPSTR和LPCSTR。 ANSI/Unicode通用数据类型为TCHAR,PTSTR,LPCTSTR。 6. 如何对Unicode进行操作? 字符集 特性 实例 ANSI 操作函数以str开头 strcpy Unicode 操作函数以wcs开头 wcscpy MBCS 操作函数以_mbs开头 _mbscpy ANSI/Unicode 操作函数以_tcs开头 _tcscpy(C运行期库) ANSI/Unicode 操作函数以lstr开头 lstrcpy(Windows函数) 所有新的和未过时的函数在Windows2000中都同时拥有ANSI和Unicode两个版本。ANSI版本函数结尾以A表示;Unicode版本函数结尾以W表示。 Windows会如下定义: #ifdef UNICODE #define CreateWindowEx CreateWindowExW #else #define CreateWindowEx CreateWindowExA #endif // !UNICODE 7. 如何表示Unicode字符串常量? 字符集 实例 ANSI “string” Unicode L“string” ANSI/Unicode T(“string”)或_TEXT(“string”)if( szError[0] == _TEXT(‘J’) { } 如:StrCat,StrChr,StrCmp和StrCpy等。 11. 如何判断一个文本文件是ANSI还是Unicode? 判断如果文本文件的开头两个字节是0xFF和0xFE,那么就是Unicode,否则是ANSI。 12. 如何判断一段字符串是ANSI还是Unicode? 用IsTextUnicode进行判断。IsTextUnicode使用一系列统计方法和定性方法,以便猜测缓存的内容。由于这不是一种确切的科学方法,因此 IsTextUnicode有可能返回不正确的结果。 13. 如何在Unicode与ANSI之间转换字符串? Windows函数MultiByteToWideChar用于将多字节字符串转换成宽字符串;函数WideCharToMultiByte将宽字符串转换成等价的多字节字符串。 10。int类型转换为CString类型? 回复人: tjmxf(天涯) (2001-12-17 19:59:34) 得0分 itoa() 回复人: zf925(天下哪来那么多高手) (2001-12-17 20:00:30) 得22分 char m[20]; str=str + itoa(i,m,10); 回复人: yuezifeng(wybzd) (2001-12-17 20:00:50) 得22分 CString str; str.Format("%d",i); 回复人: kingfish(今飞) (2001-12-17 20:06:27) 得0分 str.Format("%s%d",str,i); 回复人: tanyajun(谈子) (2001-12-17 20:09:25) 得0分 CString str="test"; int i=11; CString str1; str1.Format("%d",i); str = str+str1; 回复人: guanjinke(纶巾客) (2001-12-17 20:10:42) 得0分 int i=11; CString str="test"; CString addition; addition.Format("%d",i); str+=addition; 就可以了。 11。关于sprintf类型转换的问题 sprintf(buf,"select price from ls01 where p_date>='%'",t_date) 其中t_date是CTime类型,%后面应该是什么呢?%s是String类型,%c是char,那么CTime型对应的是什么呢? 回复人: yakai(日落长河) (2001-12-17 17:45:47) 得0分 sprintf(buf,"select price from ls01 where p_date>='%S'",(LPCSTR)t_date.Format( "%A, %B %d, %Y" ); 如果不行,就 char temp[50]; CString str=t_date.Format( "%A, %B %d, %Y" ; strcpy(temp,(LPCSTR)str); sprintf(buf,"select price from ls01 where p_date>='%S'",temp); CTime::Format返回CString 回复人: loh(乐啸天涯) (2001-12-17 17:52:57) 得0分 wait don't know 回复人: masterz() (2001-12-17 20:21:05) 得0分 SQL语句中日期要写成字符串"yyyymmdd" 21。类型转换,CString to wchar_t ?? CString ss("aabb"; wchar_t* cc; cc=ss.AllocSysString(); 22。如何将CString类型转换为_bstr_t类型? 回复人: wei97081116(韦小宝) (2001-9-4 11:19:30) 得20分 CString b; _bstr_t a; a=(_bstr_t)b; 回复人: zhaozhen1212(赵振) (2001-9-18 1:30:18) 得0分 _bstr_t a=b.AllocSysString();; 27。在一个COM的接口函数中有一个 BSTR* 类型的参数,需要把一个 char * 类型转换为 BSTR* 类型,不知道如何转换? 由于调用这个函数后需要把这个参数值再取出来所以只能用指针,另外在调用的时候应该用什么类型的数据传递参数呢?大虾帮忙。 BSTR bstr = SysAllocString(L"字符串"; 这样转换,用的时候你用地址操作符&啊,要不指针还得new 回复人: yongyue2000i(小吕) (2001-9-9 18:38:26) 得13分 CString str = "abcd"; BSTR bstr = str.AllocSysString(); 回复人: houjzs() (2001-9-9 19:14:44) 得13分 BSTR b = SysAllocString(OLESTR("your string"); 28。要把一个double的数字输出到CEdit控件是否需要类型转换? 回复人: jiangsheng(蒋晟) (2001-8-24 14:46:17) 得0分 void AFXAPI DDX_Text( CDataExchange* pDX, int nIDC, double& value ; 回复人: xiezhsh(雪中行) (2001-8-24 14:56:22) 得0分 假如你的CEdit相关的成员变量是Double型的,那根本用不着.(ClassWizard增加成员变量的对话框中,Variable Type选择Double可) 回复人: xiezhsh(雪中行) (2001-8-24 14:58:16) 得0分 假如你的CEdit相关的成员变量不是Double型的,是CString型,那就需要用ltoa()来转换成CString型, 回复人: haven(大天) (2001-8-24 14:58:32) 得0分 m_Edit.Fromat("%l",VarBouble); updatedata(false); 回复人: 12345678() (2001-8-24 14:59:54) 得0分 CString m_Edit.Format("%lf", doubleVar); GetDlgItem(EditID)->SetWindowText(m_strEdit); 29。该如何把 WINDOWPLACEMENT * 转换成 char **类型?? (char**)&pWP 30。怎样把CString的类型转换成char*型的? 回复人: dcz(dcz) (2001-8-19 19:13:27) 得5分 // str is CString var char* temp = strdup(str); ... free(temp); 33。请问怎样把SYSTEMTIME类型转换成time_t类型? SYSTEMTIME st; GetLocalTime(&st); CTime tm(st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond); time_t t = tm.GetTime(); 35。请问怎样把time_t类型转换成SYSTEMTIME类型? 回复人: haven(大天) (2001-7-26 17:12:36) 得0分 typedef struct _SYSTEMTIME typedef long time_t 很明显不行嘛! 回复人: facexy(FACE仔) (2001-7-26 17:17:38) 得0分 哎呀,问错了,前后对象相反了;-( 忙昏了的结果………… 另外,TO 楼上的: 转换是可以的 struct tm *tblock; SYSTEMTIME SystemTime; memset(&SystemTime,0,sizeof(SYSTEMTIME)); tblock=localtime(&timer); SystemTime.wYear=tblock->tm_year+1900; SystemTime.wMonth=tblock->tm_mon+1; SystemTime.wDay=tblock->tm_mday; SystemTime.wHour=tblock->tm_hour; SystemTime.wMinute=tblock->tm_min; SystemTime.wSecond=tblock->tm_sec; SystemTime.wDayOfWeek=tblock->tm_wday; return &SystemTime; 回复人: zjh73(大章鱼) (2001-7-26 20:28:28) 得0分 有两种方法: 1、用CTime类 先用time_t类型构造一个CTime对象,再定义一个SYSTEMTIME结构,最后用CTime类的成员函数GetAsSystemTime将时间转换到SYSTEMTIME结构中 即可。 2、用gmtime函数 gmtime函数将time_t时间转换到tm结构中并返回一个tm指针,再将tm结构的相对应的项赋给SYSTEMTIME相对应的项即可,不过用这种方法要注 意这两种结构在天、星期等方面的记数方法有点区别,一个一般从0开始,一个一般从1开始,赋值时要注意校正,还有要注意的是SYSTEMTIME 结构中有一项是毫秒,而time_t是以秒记数的。 回复人: zjh73(大章鱼) (2001-7-26 20:32:13) 得0分 反过来也可以用Ctime类的方法 就是先用SYSTEMTIME结构构造一个CTime对象,在用CTime类中的成员函数GetTime返回一个对应的time_t即可。 36。我现在正在学习SDK编程,遇到的问题是: 我定义了一个静态长整形变量, static long lScore=0; 我想把窗口的标题换成长整形数值,用SetWindowText函数来实现, 由于它的第二个参数要求数据类型为 unsigned short *,但用其来实现强制转换时 总是出现编译错误: cannot convert parameter 2 from 'unsigned short *' to 'const char *' 后来改成来LPCTSTR 来实现强制转换,没有出现编译错误,但函数总是执行不成功, 请教各位高人,这倒底是怎么回事??? 回复人: lwg7603(刑满释放人员) (2001-8-4 21:36:15) 得0分 TCHAR str[255]={_T('\0')}; _stprintf(str,_T("%d",lScore); SetWindowText(hwnd,str); 40。如何将 BSTR pVal 赋给:unsigned char *pw;如何将:unsigned char digest[16]赋给 BSTR *pOutVal? USES_CONVERSION; *pOutVal=SysAllocString(A2W((LPTSTR)digest)); unsigned char *pw = (unsigned char *)_com_util::ConvertBSTRToString(pInVal);