문제

OpenFileDialog는 널 종료 된 문자열 시퀀스를 포함하는 메모리에 대한 포인터를 반환 한 다음 최종 널이 배열의 끝을 나타냅니다.

이것이 내가 관리되지 않는 포인터에서 C# 줄을 되 찾는 방법이지만, 더 안전하고 우아한 방법이 있어야한다고 확신합니다.

            IntPtr unmanagedPtr = // start of the array ...
            int offset = 0;
            while (true)
            {
                IntPtr ptr = new IntPtr( unmanagedPtr.ToInt32() + offset );
                string name = Marshal.PtrToStringAuto(ptr);
                if(string.IsNullOrEmpty(name))
                    break;

                // Hack!  (assumes 2 bytes per string character + terminal null)
                offset += name.Length * 2 + 2;
            }
도움이 되었습니까?

해결책

당신이하는 일은 꽤 좋아 보인다 - 내가 할 유일한 변화는 사용하는 것입니다 Encoding.Unicode.GetByteCount(name) 대신에 name.Length * 2 (무슨 일이 일어나고 있는지 더 분명합니다).

또한 사용하고 싶을 수도 있습니다 Marshal.PtrToStringUni(ptr) 관리되지 않는 데이터가 유니 코드라는 것이 긍정적이라면 문자열 인코딩에 대한 모호성을 제거하므로.

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