2010-04-24 3 views
3

나는 cpp 클라이언트가 사용하는 C# COM 서버가 있습니다.COM을 사용하여 C#에서 cpp로 문자열 전달

C# 메서드 중 하나는 문자열을 반환합니다.

cpp에서 반환 된 문자열은 최소한 메모리보기에 따라 유니 코드 (UTF-16)로 표시됩니다.

  1. 항상 COM 문자열의 경우입니까?
  2. 대신 UTF-8을 사용할 방법이 있습니까?
  3. 문자열이 cpp와 C# 사이에 바이트 배열로 전달 된 코드를 보았습니다. 이것에 어떤 이점이 있습니까?
+0

이 스레드는 상반되는 답변으로 매력없는 downvoting fest로 바뀌 었습니다. MSDN Library에서 BSTR 및 SysAllocString에 대한 정의를 찾아보고 자신의 결론을 도출하는 것이 좋습니다. –

답변

0
  1. 번호
  2. 예. 문자열을 유니 코드 대신 ANSI 문자열로 반환하려면 C#의 메서드 정의 앞에 the attribute[return: MarshalAs(UnmanagedType.LPStr)]을 넣습니다.
  3. 예 - 작성자가 기본 마샬링 동작을 밟아 문자열 내용의 인코딩을 매우 세밀하게 제어하기 위해이 작업을 수행했을 수 있습니다.
1
  1. 예. 표준 COM 문자열 유형은 BSTR입니다. Windows의 기본 문자열 유형과 마찬가지로 UTF16으로 인코딩 된 유니 코드 문자열입니다.
  2. 아니요, COM 메소드는 UTF8 문자열을 이해하지 못합니다. 중국어로 변환 할 것입니다. UTF8은 메모리의 문자열을 조작하는 프로그램이 아니라 텍스트 파일의 좋은 인코딩입니다. UTF8에는 유니 코드 코드 포인트를 인코딩하는 데 1 ~ 4 바이트가 필요합니다. 크기를 얻거나 문자를 색인하는 것과 같은 기본 문자열 조작과는 매우 호환되지 않습니다.
  3. C 및 C++ 프로그램은 "char"유형과 호환되는 8 비트 인코딩을 사용하는 경향이 있습니다. 이것은 유니 코드가 등장하기 전의 시대로부터 거슬러 올라가는 오래된 관습입니다. 거기에 아무것도 그것에 대해 매력이있어 많은 8 비트 인코딩이 있습니다. 일반적인 문제는 텍스트로 입력 된 데이터는 동일한 8 비트 인코딩을 사용하는 프로그램에서 읽는 경우에만 올바르게 해석 될 수 있다는 것입니다. 즉, 컴퓨터가 1000 마일 미만 떨어져있을 때. 유럽에서는 더 적습니다.
+0

나에게 소리는 당신이 그것을 뒤로 가지고있는 것처럼. 그는 C++에서 C# COM 구성 요소를 호출하고 있습니다. – sblom

+0

@sblom : 예, 답이 나를 신비화했습니다. COM은 양쪽에서 같은 방식으로 보입니다. 자동화는 항상 유니 코드를 지원합니다. –