pinvoked OpenFileDialog에서 관리되지 않는 문자열 배열 (getOpenFilename)
-
21-08-2019 - |
문제
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)
관리되지 않는 데이터가 유니 코드라는 것이 긍정적이라면 문자열 인코딩에 대한 모호성을 제거하므로.
제휴하지 않습니다 StackOverflow