vc 에서 데이터 형식 변환
8644 단어 데이터 형식
VC 의 데이터 형식 변환 에 대한 정리 원본 주소:http://spaces.msn.com/wsycqyz/blog/cns!F27CB74CE9ADA6E7!152.trak
독자 차원: 초학
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;
_variant_t 와bstr_t 두 종 류 는 각각 VARIANT 와 BSTR 두 가지 데이터 형식 을 봉인 하고 관리 하 며 VARIANT 와 BSTR 두 가지 유형 은 COM 에서 사용 하 는 데이터 형식 이다.C + + 의 변 수 를 ADO 프로 그래 밍 에 적용 하기 위해 서 는 데이터 형식 만 변환 할 수 있 습 니 다.통과variant_t 와bstr_t. 이 두 가지 유형 은 C + 유형 변 수 를 COM 의 변수 로 편리 하 게 변환 할 수 있 습 니 다.
실현 가능variant_t 에서 int, String, double, long, byte 등 형식 으로 전환 합 니 다.
1. 다른 데이터 형식 을 문자열 로 변환 합 니 다.
짧 은 정형 (int) itoa (i, temp, 10); / /i 를 문자열 로 변환 하여 temp 에 넣 고 마지막 숫자 는 10 진법 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: '314159227' 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);
2. 문자열 을 다른 데이터 형식 으로 변환 합 니 다.
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 bstrVar 1 ("test") 을 직접 할당 할 수 있 습 니 다.CComBSTR bstrVar2(temp);
_bstr_t 변수bstr_t 형식의 변 수 는 직접 값 을 부여 할 수 있 습 니 다bstr_t bstrVar1("test"); _bstr_t bstrVar2(temp);
3. 다른 데이터 형식 을 CString 으로 변환 하려 면 CString 의 구성원 함수 Format 을 사용 하여 변환 합 니 다. 예 를 들 어:
정수 (int) str. Format ("% d", i); 부동 소수점 (float) str. Format ("% f", i); 문자열 포인터 (char *) 등 CString 구조 함수 가 지원 하 는 데이터 형식 은 str = username 을 직접 할당 할 수 있 습 니 다. Format 이 지원 하지 않 는 데이터 형식 에 대해 서 는 위 에서 말 한 다른 데이터 형식 을 char * 로 전환 하 는 방법 을 통 해 char * 로 먼저 이동 한 다음 에 CString 변 수 를 할당 할 수 있 습 니 다.
4. BSTR,bstr_t 와 CComBSTR
CComBSTR 은 ATL 대 BSTR 의 패키지 입 니 다.bstr_t 는 C + + BSTR 에 대한 패키지 이 고 BSTR 은 32 비트 포인터 이지 만 문자열 의 버퍼 를 직접 가리 키 지 않 습 니 다.char * BSTR 로 전환 하면 이렇게 할 수 있 습 니 다. BSTR b=_com_util:: ConvertStringToBSTR ("데이터"); / /사용 하기 전에 comutil. h 와 comsupp. libSysFreeString (bstrValue) 을 추가 해 야 합 니 다. 반대로 char * p = 사용 가능com_util::ConvertBSTRToString(b);delete p;구체 적 으로 는 1, 2 단락 의 구체 적 인 설명 을 참고 할 수 있다.
CComBSTR 와bstr_t 대량의 연산 자 를 다시 불 러 왔 습 니 다. 직접 진행 할 수 있 습 니 다.등 조작 으로 사용 이 편리 합 니 다.특히bstr_t, 모두 가 그것 을 사용 하 는 것 을 건의 합 니 다.
5. VARIANT,variant_t 와 COleVariant
VARIANT 의 구 조 는 헤더 파일 VC98IncludeOAIDL. 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;
6. 기타 COM 데이터 형식
ProgID 에 따라 CLSIDHRESULT CLSIDFromProgID (LPCOLESTR lpszProgID, LPCLSID pclsid) 를 받 습 니 다.CLSID clsid;CLSIDFromProgID( L"MAPI.Folder",&clsid);
CLSID 에 따라 ProgID WINOLEAPI ProgID FromCLSID (REFCLSID clsid, LPOLESTR * lplpszProgID) 를 받 습 니 다. 예 를 들 어 저희 가 CLSID 를 정 의 했 습 니 다.IApplication, 아래 코드 는 ProgIDLPOLESTR pProgID = 0;ProgIDFromCLSID( CLSID_IApplication,&pProgID);...///pProgID 사용 가능 CoTaskMemFree(pProgID);//석방 잊 지 마 세 요.
7. ANSI 와 유 니 코드 유 니 코드 는 넓 은 문자 문자열 이 라 고 부 르 고 COM 에서 사용 하 는 것 은 모두 유 니 코드 문자열 입 니 다.
ANSI 를 유 니 코드 (1) 로 변환 합 니 다. 예 를 들 어 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] = ''; (3) A2W 매크로 를 통 해 이 루어 집 니 다. 예 를 들 어: USES_CONVERSION; CLSIDFromProgID( A2W(szProgID),&clsid); 유 니 코드 를 ANSI (1) 로 변환 합 니 다. 와 이 드 CharToMultiByte 를 사용 합 니 다. 예 를 들 어 / / 유 니 코드 문자열 wzSomestring 이 있다 고 가정 합 니 다. char szANSIString [MAX_PATH]; WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, sizeof(szANSIString), NULL, NULL ); (2) W2A 매크로 를 사용 하여 이 루어 집 니 다. 예 를 들 어 USESCONVERSION;pTemp=W2A(wszSomeString);
기타
메시지 처리 에 있어 서 우 리 는 항상 WPARAM 이나 LPARAM 등 32 비트 데이터 (DWORD) 를 두 개의 16 비트 데이터 (WORD) 로 분해 해 야 한다. 예 를 들 어 LPARAM lParam, WORD loValue = LOWORD (lParam), / / 16 비트 WORD hiValue = HIWORD (lParam), / / 16 비트 를 높 여야 한다.
16 비트 데이터 (WORD) 에 대해 우 리 는 같은 방법 으로 높낮이 2 개의 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 b Low, BYTE b High) 로 합성 합 니 다.
R (red), G (green), B (blue) 3 색 에서 COLORREF 유형의 색상 값 COLORREF RGB (BYTE by Red, BYTE by Green, BYTE by Blue) 를 얻 을 수 있 습 니 다. 예 를 들 어 COLORREF bkcolor = RGB (0x 22, 0x98, 0x 34);
COLORREF 유형의 색상 에서 RGB 세 가지 색상 값 BYTE Red = GetRVValue (bkcolor), / / 빨간색 BYTE Green = GetGVValue (bkcolor), / / 녹색 색상 BYTE Blue = GetBValue (bkcolor), / / 란 색 을 얻 을 수 있 습 니 다.
9. 주의사항 ConvertBSTRToString 과 같은 함 수 를 사용 하려 면 헤더 파일 comutil. h 를 추가 하고 setting 에 comsupp. lib 를 추가 하거나 \ # pragma comment (lib, "comsupp. lib") 를 직접 추가 해 야 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
우리는 'X in list' (선형 검색, 이분 검색) 와 'X in set' 의 계산 시간을 조사했다컬렉션은 xin set, len(set), forxin set을 지원하는 다른 모음과 같습니다.모음에는 순서가 없기 때문에 삽입된 순서와 요소의 위치를 기록하지 않습니다.따라서 집합은 색인, 슬라이딩, 기타 순서 행...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.