Microsoft MVP성태의 닷넷 이야기
.NET Framework: 34.2. 다시... 제가 질문한 내용입니다. ^^ [링크 복사], [링크+제목 복사],
조회: 19620
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
부모글 보이기/감추기

일단, 방법은 알게 되었지만. 근본적으로 잘 이해가 더욱 안됩니다. ^^
차라리 LPWSTR 이 아닌 다른 것이었다면 그나마 이해의 조각을 맞춰보겠는데. 하필 LPWSTR 이라서 더더욱 혼동이 됩니다.

BSTR 은
typedef OLECHAR *BSTR;
이라고 정의되어 있지요.

typedef WCHAR OLECHAR;
로 내려가고.

typedef wchar_t WCHAR;
결국 BSTR == wchar_t * 와 같다는 것이죠.


답변하신 것 중에 BSTR 과 wide string 이 다른 것처럼 말씀을 하셨는데요.
LPWSTR 도 typedef 정의를 보면 다음과 같이 되어 있습니다.
typedef WCHAR *LPWSTR;

즉,,, LPWSTR == wchar_t * 와 같다는 것입니다.

하나의 wchar_t * 표현을 가지고 BSTR 과 LPWSTR 로 부를 뿐인데, 내부적으로 어떤 근거로 구별을 해서 마샬링을 하는지에 대해서 궁금한 것입니다.

다시 살펴보면 LPWSTR 이든, BSTR 이든 결국 다음과 같이 변수를 정의할 수 있는데요.
wchar_t *pTest1 = ::SysAllocString( L"test" );
wchar_t *pTest2 = L"test";
위의 pTest1 은 BSTR 로 마샬링을 해야 하고, pTest2 는 LPWSTR 로 마샬링해야 하는 이유가 이해가 안됩니다.

실제로 위의 pTest1 과 pTest2 가 가리키는 메모리를 확인해 봐도, 그 두개의 차이점을 발견할 수 없습니다.
결과는 다음과 같이 나오는 데요.

74 00 65 00 73 00 74 00 00 00
t e s t \0


어떤 근거로, 동일한 메모리에 대해서, 동일한 wchar_t * 변수를 전달하는 데, ::SysAllocString 으로 할당하면 정상동작하고, L"" 로 할당하면 그렇지 않느냐는 것입니다.
말씀해 주신 그 URL 에서는 그에 대한 설명이 없는 것 같습니다. 한번 만 더 도움 좀 부탁드립니다. ^^








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

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

비밀번호

댓글 작성자
 




[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
14013정성태9/14/2025436닷넷: 2363. C# - Whisper.NET Library를 이용해 음성을 텍스트로 변환 및 번역하는 예제파일 다운로드1
14012정성태9/9/2025821닷넷: 2362. C# - Windows.Media.Ocr: 윈도우 운영체제에 포함된 OCR(Optical Character Recognition)파일 다운로드1
14011정성태9/7/20251406닷넷: 2361. C# - Linux 환경의 readlink 호출
14010정성태9/1/20251505오류 유형: 983. apt update 시 "The repository 'http://deb.debian.org/debian buster Release' does not have a Release file." 오류
14009정성태8/28/20251940닷넷: 2360. C# 14 - (11) Expression Tree에 선택적 인수와 명명된 인수 허용파일 다운로드1
14008정성태8/26/20252266닷넷: 2359. C# 14 - (10) 복합 대입 연산자의 오버로드 지원파일 다운로드1
14007정성태8/25/20252646닷넷: 2358. C# - 현재 빌드에 적용 중인 컴파일러 버전 확인 방법 (#error version)
14006정성태8/23/20252834Linux: 121. Linux - snap 패키지 관리자로 설치한 소프트웨어의 디렉터리 접근 제한
14005정성태8/21/20252307오류 유형: 982. sudo: unable to load /usr/libexec/sudo/sudoers.so: libssl.so.3: cannot open shared object file: No such file or directory
14004정성태8/21/20252600오류 유형: 981. dotnet 실행 시 No usable version of the libssl was found
14003정성태8/21/20252860닷넷: 2357. C# 14 - (9) 새로운 지시자 추가 (Ignored directives)
14002정성태8/20/20252847오류 유형: 980. C# - appsettings.json 파일의 설정값이 적용 안 된다면?
14001정성태8/19/20256091닷넷: 2356. .NET SDK 10 - 단일 소스 코드 파일을 빌드/실행하는 기능을 "dotnet" 명령어에 추가 [1]
14000정성태8/18/20252947오류 유형: 979. ERROR: failed to solve: failed to read dockerfile: open Dockerfile: no such file or directory
13999정성태8/15/20252906닷넷: 2355. C# 14 - (8) null 조건부 연산자 개선 - 대입문에도 사용 가능파일 다운로드1
13998정성태8/14/20252862닷넷: 2354. C# 14 - (7) 확장 메서드에 정적 메서드와 속성 지원을 위한 전용 구문 추가파일 다운로드1
13997정성태8/14/20252977Linux: 120. docker 컨테이너로 매핑된 볼륨에 컨테이너 측의 사용자 ID를 유지하면서 복사하는 방법
13996정성태8/13/20252431오류 유형: 978. Unable to find the requested .Net Framework Data Provider.
13995정성태8/13/20252607개발 환경 구성: 754. Visual C++ - 리눅스 빌드를 위한 Ubuntu 18 docker 컨테이너 설정
13994정성태8/12/20252331오류 유형: 977. SQL Server - User, group, or role '...' already exists in the current database. (Microsoft SQL Server, Error: 15023)
13993정성태8/11/20253138오류 유형: 976. Microsoft.ML.OnnxRuntimeGenAI 패키지 사용 시 "cublasLt64_12.dll" which is missing. (Error 126: "The specified module could not be found.") 오류
13992정성태8/11/20253097닷넷: 2353. C# - Foundry Local을 이용한 gpt-oss-20b 모델 사용파일 다운로드1
13991정성태8/9/20252837오류 유형: 975. winget - Foundry Local 패키지 업데이트가 안 되는 문제
13990정성태8/8/20252348Windows: 283. Time zone 설정이 없는 Windows Server 2025
13989정성태8/8/20253358닷넷: 2352. C# - Windows S-mode 환경인지 체크하는 방법파일 다운로드1
[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...