2013-12-14 1 views
1

나는 D에서 창을 만들었고 CreateWindowA 함수는 문자에 대한 포인터, 기본적으로 C 문자 배열을 필요로합니다.D 스타일 배열에서 C 스타일 배열로

D 스타일 배열 (char[])을 C 스타일 배열 (char*)로 변환하려면 어떻게해야합니까?

+1

"버퍼 오버런 위험을 감수하는 코드는 2 분의 인터넷 검색 결과에 나온 공식 튜토리얼의"arr.ptr "을 사용하여 배열에서 포인터를 겁낼 수 있습니다. –

+1

@ H2CO3 D 문자열이 Null로 끝나지 않고 C 문자열이 정상적으로 존재하기 때문에 대개 나쁜 생각입니다. C 함수에'ptr'을 건네도 길이를 취하고 전달 된 배열에 널 종결자를 찾지 않을 때에 만 작동합니다. –

+0

@JonathanMDavis 정확히 (그러나 명시적인 길이를 전달하는 것이 더 좋은 방법입니다 ...) –

답변

5

두 가지 기능은 일반적으로 std.string.toStringzstd.utf.toUTFz입니다.

toStringzconst char* 인 C 함수로 전달할 수있는 stringimmutable(char)*으로 변환합니다. string이 널 종료인지 결정할 수있는 경우 (일반적으로 널 종료 자 하나가 끝에 도달 한 문자열 리터럴의 경우에만 해당), 할당하지 않고 의 ptr 특성을 사용하며, 그러나 대부분의 경우 할당됩니다.

toUTFz은 모든 문자열 유형을 모든 문자 포인터 유형으로 변환합니다. Windows 용 W 함수는 모두 UTF-16을 사용하기 때문에 Windows 용 const(wchar)*으로 변환하는 데 가장 자주 사용되지만, char*으로 변환하는 데에도 사용할 수 있습니다. str.toUTFz!(char*)(). toStringz처럼, 불필요하다고 판단 할 수 있으면 할당하지 않으려하지만 거의 항상 필요합니다.

이제 특수한 경우에 Windows에서 A 함수 중 하나를 사용하려고합니다. 이것은 거의 항상 나쁜 생각이며 반대하는 것이 좋습니다. toUTFz을 사용하여 stringconst(wchar)*으로 변환하고 CreateWindowW으로 전달하십시오. AFAIK는 A 함수의 유일한 장점은 Win2K 이전 버전에서 작동한다는 것입니다. 그들에 관한 모든 것이 더 나쁘다. 그러나 어떤 이유로 든 A 함수를 사용해야한다고 가정하면 A 함수는 UTF-8이 아니라 "Windows 8 비트 문자 집합"을 사용하기 때문에 std.windows.charset.toMBSz을 사용해야합니다. toMBSz 문자열을 해당 형식으로 변환합니다.

+0

Windows-ASCII 함수를 사용하는 이유는'core.sys.windows.windows' 모듈 내부에 넓은 함수를 찾을 수 없기 때문입니다. 따라서 구현 된 D가 없다고 결론지었습니다. –

+0

@ JeroenBollen 필요한 것은 함수 프로토 타입뿐입니다. druntime에 어떤 이유로 든이 없으면 직접 선언 할 수 있습니다. 그러나 Windows API로 많은 일을하는 대부분의 D 프로그래머는 druntime보다 훨씬 더 완벽한 http://www.dsource.org/projects/bindings/wiki/WindowsApi를 사용합니다. –

+0

그래서 'extern (Windows) void * CreateWindowW (...);'와 같은 것을 할 수 있습니다. 외부 라이브러리를 링크하거나 모듈을 포함 할 필요가 없습니까? –

3

당신은 D 배열의 ptr 필드를 차지합니다. length 필드를 채우는 길이

그러나 C 스타일 문자열이 필요한 경우 null 종결자를 추가하고 첫 번째 문자로 포인터를 반환하는 toStringz 메서드가 필요합니다. k API가 GC로 포인터가 매달리지 않도록하기 위해 자체 복사본을 만들지 않으면 참조하십시오.

+1

일반적으로 올바른 내용입니다. 그러나 Windows'A' 함수의 경우,'char'을 사용하는 동안 UTF-8을 사용하지 않기 때문에 그렇지 않습니다. 그들에게'std.windows.charset.toMBSz'가 필요합니다. –