2010-12-22 3 views
0

C에서 BSTR * CHAR * 데이터 유형으로 변환해야합니다. VC++ 라이브러리 또는 함수를 사용하지 않고이 작업을 수행 할 수 있습니까? 코드는 순수한 C에 있어야합니다. 'comutil.h'에는 함수가 있지만 C++에 있다고 생각합니다.BSTR을 CHAR *로 변환하고 CHAR *를 C로 BSTR로 변환

또한 SysAllocString 함수에 대해서는 C에서 사용할 수 있고 CHAR *?로 변환 할 수 있습니까? 도와주세요.

감사합니다, sveerap

답변

0

그것은 당신이 "VC++ 라이브러리 나 함수"를 정의하는 방법을 따라 달라집니다. BSTR 타입은 꽤 VC++ 타입입니다. 그러나 "Windows"유형이라면 "Windows"라이브러리에 BSTR 조작 함수가 있고 사용할 수있는 "Windows"함수가 있습니다. 그것은 모두 당신이하고있는 일, 당신이 사용하고있는 컴파일러, 그리고 다른 기술적 한계들에 달려 있습니다. 질문에서 VC++ 라이브러리를 사용할 수없는 이유를 설명하는 것이 좋습니다.

사실 BSTR 유형은 매우 잘 이해되고 문서화되어 있습니다. here을 참조하십시오.

Microsoft BSTR 조작 함수를 사용하여 어떤 이유로 든 BSTRchar * 사이에서 변환 할 BSTR 조작 함수를 직접 작성할 수 없으면 가능한 범위를 넘지 않습니다.

저렴하고 매우 불쾌한 해킹으로 BSTR을 char *에 캐스팅 한 다음 모든 대체 문자를 버퍼 또는 유사한 것으로 복사했습니다. 그러나 이것은 특수 문자에 대처하지 않으며 매우 아주 고약한 해킹입니다. BSTR의 문자가 모두 표준 ASCII 문자 (또는 그렇지 않은 경우 상관하지 않음)를 보장 할 수 없거나 적절한 디버깅이 아닌 적절한 디버깅 해킹 또는 무언가에 불과하다는 것을 보증 할 수 없다면하지 마십시오. 품질의 코드.

+0

응답 해 주셔서 감사합니다. 나는 Visual Studio 2008이지만 순수한 C 코드로 컴파일해야만한다.이 코드는 c 모듈과 대화 할 수있는 레거시 시스템과 통합되는 dll에 내장되어야한다. – sveerap

2

SysAllocStringByteLen()을 사용하여 char *에서 BSTR로 이동할 수 있습니다. 그러나 char *가 ASCII 문자 만 포함하고 문자 변환이 수행되지 않는 경우에만 안전합니다. 문제를 일으키지 않는 경우는 거의 없습니다.

다음 홉이 MultiByteToWideChar() 인 경우 일반적으로 문자열이 다른 방법으로 인코딩 된 것을 알지 못하는 경우 CodePage 인수를 CP_ACP로 설정하려고합니다. 그 문자열을 생성 한 다음 SysAllocString()에 전달하여 BSTR을 가져올 수 있습니다.

다른 방법은 WideCharToMultiByte()입니다. BSTR을 직접 전달하면 0 문자가 포함되어 있지 않으면 작동합니다. 그러나 어쨌든 변환은 손실됩니다. 액센트가있는 문자가 포함 된 문자열 또는 사용하는 코드 페이지에서 표현할 수없는 문자열로 작업 할 때 발생할 수있는 상당한 두통을 조심하십시오.

+0

응답 해 주셔서 감사합니다. vC++에서 사용할 수있는 comutil.h 메서드를 사용하여 dll에서 C 함수를 노출하고이를 유틸리티로 사용했습니다. 그것은 효과적이지만 효과적인 방법인지는 확실치 않습니다. – sveerap

관련 문제