문제

유지할 때 COM 인터페이스는 비어 있어야합니다 BSTR 같은 방식으로 취급됩니다 NULL? 다시 말해이 두 기능 호출이 동일한 결과를 생성해야합니까?

 // Empty BSTR
 CComBSTR empty(L""); // Or SysAllocString(L"")
 someObj->Foo(empty);

 // NULL BSTR
 someObj->Foo(NULL);     
도움이 되었습니까?

해결책

예 - 널 bstr는 빈 BSTR과 동일합니다. VS6에서 2003으로 전환했을 때 발견되지 않은 모든 종류의 버그가 있었음을 기억합니다. CComBSTR 클래스는 빈 문자열이 아닌 NULL을 사용하여 할당 한 기본 생성자를 변경했습니다. 예를 들어 BSTR을 일반 C 스타일 문자열로 취급하고 다음과 같은 기능으로 전달할 때 발생합니다. strlen, 또는 초기화를 시도하십시오 std::string 그것으로.

Eric Lippert는 BSTR에 대해 자세히 설명합니다 에릭의 BSTR 의미에 대한 완전한 가이드:

먼저 차이점을 나열한 다음 각 지점을 극심한 세부 사항으로 논의하겠습니다.

1) BSTR은 NULL과 ""에 대한 동일한 의미론을 가져야합니다. PWSZ는 종종 그것들과 다른 의미를 가지고 있습니다.

2) BSTR은 Sysalloc* 기능 제품군과 함께 할당되어 해방되어야합니다. PWSZ는 스택에서 자동 저장 버퍼 일 수 있거나 Malloc, New, LocalAlloc 또는 기타 메모리 할당자를 할당 할 수 있습니다.

3) BSTR의 길이는 고정되어 있습니다. PWSZ의 길이는 모든 길이 일 수 있으며, 버퍼의 유효한 메모리의 양에 의해서만 제한 될 수 있습니다.

4) BSTR은 항상 버퍼의 첫 번째 유효한 문자를 가리 킵니다. PWSZ는 문자열 버퍼의 중간 또는 끝을 포인터 일 수 있습니다.

5) n-byte bstr를 할당 할 때는 N/2 와이드 캐릭터를위한 공간이 있습니다. PWSZ에 N 바이트를 할당하면 N / 2-1 문자를 저장할 수 있습니다. NULL을위한 공간을 떠나야합니다.

6) BSTR은 제로 문자를 포함한 유니 코드 데이터를 포함 할 수 있습니다. PWSZ는 문자열 끝 마커를 제외하고는 0 특성을 포함하지 않습니다. BSTR과 PWSZ는 모두 마지막으로 유효한 문자 이후 항상 제로 문자를 가지지 만 BSTR에서 유효한 문자는 제로 문자 일 수 있습니다.

7) BSTR은 실제로 홀수의 바이트를 포함 할 수 있습니다. 이진 데이터를 주위에 이동하는 데 사용될 수 있습니다. PWSZ는 거의 항상 수많은 바이트이며 유니 코드 문자열을 저장하는 데만 사용됩니다.

다른 팁

이 딜레마를 처리하는 가장 쉬운 방법은 ccombstr를 사용하고 .length ()가 0이되는지 확인하는 것입니다. 그것은 빈 값과 널 값 모두에서 작동합니다.

그러나 빈 BSTR을 해제해야합니다. 그렇지 않으면 메모리 누출이 발생합니다. 나는 최근에 다른 코드에서 그 중 일부를 보았다. 조심스럽게 보지 않는다면 찾기가 매우 어렵습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top