Microsoft MVP성태의 닷넷 이야기
.NET Framework: 34.3. 다시... 정봉겸님이 하신... 명확한 답변입니다. [링크 복사], [링크+제목 복사],
조회: 20294
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
부모글 보이기/감추기

말씀하신 문제는 마샬링의 이해와는 상관없이 COM의 BSTR을 알아야 설명이 가능합니다.

결론부터 말씀드리면 OLECHAR* 와 BSTR은 다릅니다. 단지 호환성을 위해서 BSTR의 문자열부분을 OLECHAR*로 처리하는 것입니다. 그런 이유로 SysAllocString같은 함수를 사용하도록 강제하는 것입니다. 결과가 같다면 이를 사용할 필요가 없겠죠. 간단히 위의 예를 사용하겠습니다.

74 00 65 00 73 00 74 00 00 00 = test\0

이는 OLECHAR*이고 BSTR의 일부분이기 때문에 같게 보이는 부분입니다. 하지만, 사실은

08 00 00 00 74(*) 00 65 00 73 00 74 00 00 00 = ?\0test\0

DWORD크기로 스트링의 사이즈를 앞에 숨겨붙인 이것이 진짜 BSTR입니다. 문제는 이를 그대로 OLECHAR*로 처리하면 ?\0의 이상한 문자가 붙어서 문제가 되기 때문에 호환성을 위해서 포인터를 (*)에 두고 OLECHAR*로 취급을 하는 것입니다.

결국 매크로에는 BSTR을 OLECHAR*로 정의하였지만, BSTR이 OLECHAR*이라는 이야기는 아닙니다.

--

도움이 되셨기를..^^

bk








[최초 등록일: ]
[최종 수정일: 3/30/2005]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 61  62  63  64  65  66  67  68  69  70  [71]  72  73  74  75  ...
NoWriterDateCnt.TitleFile(s)
12253정성태7/2/202023924.NET Framework: 922. C# - .NET ThreadPool의 Local/Global Queue파일 다운로드1
12252정성태7/2/202025357.NET Framework: 921. C# - I/O 스레드를 사용한 비동기 소켓 서버/클라이언트파일 다운로드2
12251정성태7/1/202025300.NET Framework: 920. C# - 파일의 비동기 처리 유무에 따른 스레드 상황 [1]파일 다운로드2
12250정성태6/30/202025523.NET Framework: 919. C# - 닷넷에서의 진정한 비동기 호출을 가능케 하는 I/O 스레드 사용법 [1]파일 다운로드1
12249정성태6/29/202022042오류 유형: 625. Microsoft SQL Server 2019 RC1 Setup - 설치 제거 시 Warning 26003 오류 발생
12248정성태6/29/202019734오류 유형: 624. SQL 서버 오류 - service-specific error code 17051
12247정성태6/29/202021573.NET Framework: 918. C# - 불린 형 상수를 반환값으로 포함하는 3항 연산자 사용 시 단축 표현 권장(IDE0075) [2]파일 다운로드1
12246정성태6/29/202023597.NET Framework: 917. C# - USB 관련 ETW(Event Tracing for Windows)를 이용한 키보드 입력을 감지하는 방법
12245정성태6/24/202023996.NET Framework: 916. C# - Task.Yield 사용법 (2) [2]파일 다운로드1
12244정성태6/24/202024223.NET Framework: 915. ETW(Event Tracing for Windows)를 이용한 닷넷 프로그램의 내부 이벤트 활용 [1]파일 다운로드1
12243정성태6/23/202019922VS.NET IDE: 147. Visual C++ 프로젝트 - .NET Core EXE를 "Debugger Type"으로 지원하는 기능 추가
12242정성태6/23/202022285오류 유형: 623. AADSTS90072 - User account '...' from identity provider 'live.com' does not exist in tenant 'Microsoft Services'
12241정성태6/23/202023636.NET Framework: 914. C# - Task.Yield 사용법파일 다운로드1
12240정성태6/23/202024483오류 유형: 622. 소켓 바인딩 시 "System.Net.Sockets.SocketException: An attempt was made to access a socket in a way forbidden by its access permissions" 오류 발생
12239정성태6/21/202024854Linux: 30. (윈도우라면 DLL에 속하는) .so 파일이 텍스트로 구성된 사례 [1]
12238정성태6/21/202021917.NET Framework: 913. C# - SharpDX + DXGI를 이용한 윈도우 화면 캡처 라이브러리
12237정성태6/20/202022067.NET Framework: 912. 리눅스 환경의 .NET Core에서 "test".IndexOf("\0")가 0을 반환
12236정성태6/19/202023054오류 유형: 621. .NET Standard 대상으로 빌드 시 dynamic 예약어에서 컴파일 오류 - error CS0656: Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'
12235정성태6/19/202020175오류 유형: 620. Windows 10 - Inaccessible boot device 블루 스크린
12234정성태6/19/202020010개발 환경 구성: 494. NuGet - nuspec의 패키지 스키마 버전(네임스페이스) 업데이트 방법
12233정성태6/19/202022088오류 유형: 619. SQL 서버 - The transaction log for database '...' is full due to 'LOG_BACKUP'. - 두 번째 이야기
12232정성태6/19/202020044오류 유형: 618. SharePoint - StoreBusyRetryLater 오류
12231정성태6/15/202023796.NET Framework: 911. Console/Service Application을 위한 SynchronizationContext - AsyncContext
12230정성태6/15/202022259오류 유형: 617. IMetaDataImport::GetMethodProps가 반환하는 IL 코드 주소(RVA) 문제
12229정성태6/13/202024893.NET Framework: 910. USB/IP PROJECT를 이용해 C#으로 USB Keyboard + Mouse 가상 장치 만들기 [1]
12228정성태6/12/202022646.NET Framework: 909. C# - Source Generator를 적용한 XmlCodeGenerator파일 다운로드1
... 61  62  63  64  65  66  67  68  69  70  [71]  72  73  74  75  ...