VCデータ型使用変換祥解

23928 ワード

//////////////////////////////////
CString -> char*           
//////////////////////////////////
#include "atlbase.h"
CString strTmp;
char* cpTmp;
USES_CONVERSION
cpTmp=T2A(strTmp);
//////////////////////////////////
!!!!
//////////////////////////////////


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);



CString
str = "2008 ";
buf = (LPSTR)(LPCTSTR)str; 
BSTR _variant_t
v1 = (_bstr_t)" ";
buf = _com_util::ConvertBSTRToString((_bstr_t)v1);


strcpy(temp,"123"); 

(int)
i = atoi(temp); 
(long)
l = atol(temp); 
(double)
d = atof(temp);

、 CString
CString Format , :


(int)
str.Format("%d",i); 
(float)
str.Format("%f",i); 
(char *) CString
str = username;

、BSTR、_bstr_t CComBSTR


CComBSTR、_bstr_t BSTR ,BSTR 32 。
char * BSTR : BSTR b=_com_util::ConvertStringToBSTR(" ");/// comutil.h
char *p=_com_util::ConvertBSTRToString(b);


、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 :

unsigned char 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 
IUnknown FAR* punkVal;  VT_UNKNOWN 
IDispatch FAR* pdispVal;  VT_DISPATCH 
SAFEARRAY FAR* parray;  VT_ARRAY|* 
unsigned char 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;  VT_BYREF 


_variant_t VARIANT , , 。

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;




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  
       
 、BSTR、LPSTR LPWSTR 
   Visual C++.NET , , BSTR、LPSTR LPWSTR 。 , ANSI、Unicode (MBCS) 。
       BSTR、LPSTR  LPWSTR ?
  BSTR(Basic STRing,Basic   )   OLECHAR*   Unicode   。                 。           API  ( SysAllocString)               ,  BSTR       COM   ,                       。 1   BSTR   ,  DWORD               ,         Unicode     。
  LPSTR LPWSTR Win32 VC++             。LPSTR          NULL(‘/0’)   8 ANSI      , LPWSTR      NULL   16          。 VC++ ,          , LPTSTR、LPCTSTR ,       2  。
    ,LPCTSTR  “long pointer to a constant generic string”,  “                 ”, C/C++ const char*   , LPTSTR    char*。
     ,        :
#ifdef UNICODE 
 typedef LPWSTR LPTSTR;
 typedef LPCWSTR LPCTSTR;
#else
 typedef LPSTR LPTSTR;
 typedef LPCSTR LPCTSTR;
#endif
 、CString、CStringA   CStringW
  Visual C++.NET  CStringT  ATL MFC    “  ”    ,  CString、CStringA CStringW    ,              。       TCHAR、char wchar_t。TCHAR Unicode      WCHAR(16 Unicode  ), ANSI    char。wchar_t     unsigned short。  CString MFC         ,      。
 、VARIANT、COleVariant  _variant_t
   OLE、ActiveX COM ,VARIANT                ,           ,         ,                    。        OAIDL.H   VARIANT        :
struct tagVARIANT {
 VARTYPE vt;
 union {
  short iVal; // VT_I2.
  long lVal; // VT_I4.
  float fltVal; // VT_R4.
  double dblVal; // VT_R8.
  DATE date; // VT_DATE.
  BSTR bstrVal; // VT_BSTR.
  …
  short * piVal; // VT_BYREF|VT_I2.
  long * plVal; // VT_BYREF|VT_I4.
  float * pfltVal; // VT_BYREF|VT_R4.
  double * pdblVal; // VT_BYREF|VT_R8.
  DATE * pdate; // VT_BYREF|VT_DATE.
  BSTR * pbstrVal; // VT_BYREF|VT_BSTR.
 };
};
    ,VARIANT     C  ,          vt、            union  。  ,  vt VT_I2,       iVal   VARIANT  。  ,    VARIANT     ,        。  :
VARIANT va;
:: VariantInit(&va); //
int a = 2002;
va.vt = VT_I4; // long
va.lVal = a; //
        VARIANT     ,Windows               :
  VariantInit ——        VT_EMPTY;
  VariantClear ——       VARIANT;
  VariantChangeType ——   VARIANT   ;
  VariantCopy ——      VARIANT         VARIANT。
  COleVariant   VARIANT     。                ,          VariantInit     ,                     ,   VariantCopy        , VARIANT         ,             ,         VariantClear,              。    ,COleVariant        VARIANT               。       :
COleVariant v1("This is a test"); //     
COleVariant v2 = "This is a test";
// VT_BSTR , "This is a test"
COleVariant v3((long)2002);
COleVariant v4 = (long)2002;
// VT_I4 , 2002
  _variant_t     COM VARIANT ,     COleVariant  。   Visual C++.NET MFC                       :
  #include "comutil.h"
  #pragma comment( lib, "comsupp.lib" )
 、CComBSTR _bstr_t
  CComBSTR  BSTR         ATL ,        。  :
CComBSTR bstr1; 
bstr1 = "Bye"; //
OLECHAR* str = OLESTR("ta ta"); // 5
CComBSTR bstr2(wcslen(str)); // 5
wcscpy(bstr2.m_str, str); // BSTR
CComBSTR bstr3(5, OLESTR("Hello World"));
CComBSTR bstr4(5, "Hello World");
CComBSTR bstr5(OLESTR("Hey there"));
CComBSTR bstr6("Hey there");
CComBSTR bstr7(bstr6);
// , "Hey there"
  _bstr_t  C++ BSTR   ,             SysAllocString SysFreeString  ,       BSTR API  。 _variant_t  ,       comutil.h comsupp.lib。
 、BSTR、char* CString  
  (1) char*   CString
    char*   CString,       ,    CString::Format  。  :
char chArray[] = "This is a test";
char * p = "This is a test";
   
LPSTR p = "This is a test"; 
       Unicode      
TCHAR * p = _T("This is a test"); 
   
LPTSTR p = _T("This is a test");
CString theString = chArray;
theString.Format(_T("%s"), chArray);
theString = p;
  (2) CString   char*
    CString    char*(LPSTR)  ,          :
     ,      。  :
CString theString( "This is a test" );
LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;
     ,  strcpy。  :
CString theString( "This is a test" );
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
_tcscpy(lpsz, theString);
        ,strcpy(    Unicode/MBCS _tcscpy)        const wchar_t* (Unicode) const char* (ANSI),               。
     ,  CString::GetBuffer。  :
CString s(_T("This is a test "));
LPTSTR p = s.GetBuffer();
// p
if(p != NULL) *p = _T('/0');
s.ReleaseBuffer();
// , CString
  (3) BSTR   char*
     ,  ConvertBSTRToString。  :
#include 
#pragma comment(lib, "comsupp.lib")
int _tmain(int argc, _TCHAR* argv[]){
BSTR bstrText = ::SysAllocString(L"Test");
char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);
SysFreeString(bstrText); //
delete[] lpszText2;
return 0;
}
     ,  _bstr_t        。  :
_bstr_t b = bstrText;
char* lpszText2 = b;
  (4) char*   BSTR
     ,  SysAllocString API  。  :
BSTR bstrText = ::SysAllocString(L"Test");
BSTR bstrText = ::SysAllocStringLen(L"Test",4);
BSTR bstrText = ::SysAllocStringByteLen("Test",4);
     ,  COleVariant _variant_t。  :
//COleVariant strVar("This is a test");
_variant_t strVar("This is a test");
BSTR bstrText = strVar.bstrVal;
     ,  _bstr_t,          。  :
BSTR bstrText = _bstr_t("This is a test"); 
     ,  CComBSTR。  :
BSTR bstrText = CComBSTR("This is a test"); 
   
CComBSTR bstr("This is a test");
BSTR bstrText = bstr.m_str;
     ,  ConvertStringToBSTR。  :
char* lpszText = "Test";
BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText);
  (5) CString   BSTR
         CStringT::AllocSysString   。  :
CString str("This is a test");
BSTR bstrText = str.AllocSysString();

SysFreeString(bstrText); //
  (6) BSTR   CString
            :
BSTR bstrText = ::SysAllocString(L"Test");
CStringA str;
str.Empty();
str = bstrText;
   
CStringA str(bstrText); 
  (7) ANSI、Unicode         
     ,  MultiByteToWideChar ANSI     Unicode  ,  WideCharToMultiByte Unicode     ANSI  。
     ,  “_T” ANSI   “  ”     ,  “L” ANSI   Unicode,    C++       S ANSI      String*  。  :
TCHAR tstr[] = _T("this is a test");
wchar_t wszStr[] = L"This is a test";
String* str = S”This is a test”;
     ,  ATL 7.0      。ATL7.0   3.0                         ,     3       :
    ,   C  “ ”,   ATL 3.0    ,   C    ,2  “to”,EX            。SourceType DestinationType   A、T、W OLE,      ANSI、Unicode、“  ”   OLE   。  ,CA2CT   ANSI             。         :
LPTSTR tstr= CA2TEX<16>("this is a test");
LPCTSTR tcstr= CA2CT("this is a test");
wchar_t wszStr[] = L"This is a test";
char* chstr = CW2A(wszStr);