나는 D에서 창을 만들었고 CreateWindowA
함수는 문자에 대한 포인터, 기본적으로 C 문자 배열을 필요로합니다.D 스타일 배열에서 C 스타일 배열로
D 스타일 배열 (char[]
)을 C 스타일 배열 (char*
)로 변환하려면 어떻게해야합니까?
나는 D에서 창을 만들었고 CreateWindowA
함수는 문자에 대한 포인터, 기본적으로 C 문자 배열을 필요로합니다.D 스타일 배열에서 C 스타일 배열로
D 스타일 배열 (char[]
)을 C 스타일 배열 (char*
)로 변환하려면 어떻게해야합니까?
두 가지 기능은 일반적으로 std.string.toStringz
과 std.utf.toUTFz
입니다.
toStringz
은 const char*
인 C 함수로 전달할 수있는 string
을 immutable(char)*
으로 변환합니다. string
이 널 종료인지 결정할 수있는 경우 (일반적으로 널 종료 자 하나가 끝에 도달 한 문자열 리터럴의 경우에만 해당), 할당하지 않고 의 ptr
특성을 사용하며, 그러나 대부분의 경우 할당됩니다.
toUTFz
은 모든 문자열 유형을 모든 문자 포인터 유형으로 변환합니다. Windows 용 W
함수는 모두 UTF-16을 사용하기 때문에 Windows 용 const(wchar)*
으로 변환하는 데 가장 자주 사용되지만, char*
으로 변환하는 데에도 사용할 수 있습니다. str.toUTFz!(char*)()
. toStringz
처럼, 불필요하다고 판단 할 수 있으면 할당하지 않으려하지만 거의 항상 필요합니다.
이제 특수한 경우에 Windows에서 A
함수 중 하나를 사용하려고합니다. 이것은 거의 항상 나쁜 생각이며 반대하는 것이 좋습니다. toUTFz
을 사용하여 string
을 const(wchar)*
으로 변환하고 CreateWindowW
으로 전달하십시오. AFAIK는 A
함수의 유일한 장점은 Win2K 이전 버전에서 작동한다는 것입니다. 그들에 관한 모든 것이 더 나쁘다. 그러나 어떤 이유로 든 A
함수를 사용해야한다고 가정하면 A
함수는 UTF-8이 아니라 "Windows 8 비트 문자 집합"을 사용하기 때문에 std.windows.charset.toMBSz
을 사용해야합니다. toMBSz
문자열을 해당 형식으로 변환합니다.
Windows-ASCII 함수를 사용하는 이유는'core.sys.windows.windows' 모듈 내부에 넓은 함수를 찾을 수 없기 때문입니다. 따라서 구현 된 D가 없다고 결론지었습니다. –
@ JeroenBollen 필요한 것은 함수 프로토 타입뿐입니다. druntime에 어떤 이유로 든이 없으면 직접 선언 할 수 있습니다. 그러나 Windows API로 많은 일을하는 대부분의 D 프로그래머는 druntime보다 훨씬 더 완벽한 http://www.dsource.org/projects/bindings/wiki/WindowsApi를 사용합니다. –
그래서 'extern (Windows) void * CreateWindowW (...);'와 같은 것을 할 수 있습니다. 외부 라이브러리를 링크하거나 모듈을 포함 할 필요가 없습니까? –
당신은 D 배열의 ptr
필드를 차지합니다. length
필드를 채우는 길이
그러나 C 스타일 문자열이 필요한 경우 null 종결자를 추가하고 첫 번째 문자로 포인터를 반환하는 toStringz
메서드가 필요합니다. k
API가 GC로 포인터가 매달리지 않도록하기 위해 자체 복사본을 만들지 않으면 참조하십시오.
일반적으로 올바른 내용입니다. 그러나 Windows'A' 함수의 경우,'char'을 사용하는 동안 UTF-8을 사용하지 않기 때문에 그렇지 않습니다. 그들에게'std.windows.charset.toMBSz'가 필요합니다. –
"버퍼 오버런 위험을 감수하는 코드는 2 분의 인터넷 검색 결과에 나온 공식 튜토리얼의"arr.ptr "을 사용하여 배열에서 포인터를 겁낼 수 있습니다. –
@ H2CO3 D 문자열이 Null로 끝나지 않고 C 문자열이 정상적으로 존재하기 때문에 대개 나쁜 생각입니다. C 함수에'ptr'을 건네도 길이를 취하고 전달 된 배열에 널 종결자를 찾지 않을 때에 만 작동합니다. –
@JonathanMDavis 정확히 (그러나 명시적인 길이를 전달하는 것이 더 좋은 방법입니다 ...) –