2014-02-15 2 views
1

Cocoa 및 Objective C 사용을 원하지 않는 프로젝트에서 작업 중입니다.목표 C 화면 크기에 액세스하는 런타임

나는 다른 날 Objective C 런타임 라이브러리를 우연히 발견하고 화면 크기에 액세스하려고했습니다. 코코아는 옵션을 선택하지 않습니다 및 탄소 정말 더 이상 지원되지 않는 사용

auto screen = objc_msgSend(objc_lookUpClass("NSScreen"),sel_getUid("mainScreen")); //Returns an NSScreen* 
auto frame = objc_msgSend(screen, sel_getUid("frame")); // should return an NSRect but I get an EXC_BAD_ACCESS and the program quits 

:

내가 현재 가지고있는 코드입니다. 누군가가 Objc 런타임에 익숙하고이 문제를 해결할 수 있기를 바랍니다.

+0

나는 당신의 문제에 관해 당신을 도울 수는 없지만 왜 나는 코코아를 피하고 싶어하는지 궁금 할 것입니다. 이 정보를 공개 할 수 있습니까? – JiaYow

+0

@awesomeyi 나는 그들이 똑같지 않다는 것을 충분히 알고 있습니다. objc 런타임 API를 사용하면 객관적인 C 코드를 사용하지 않고도 코코아 라이브러리를 사용할 수 있습니다. –

+1

@JiaYow Windows, Mac 및 Linux 용 경량의 크로스 플랫폼 윈도우 시스템을 만들고자합니다. 크로스 플랫폼으로 만들기 위해이 라이브러리를 C++로 만들고 있습니다. 나는 그것을 엄격하게 C++이 아닌 크로스 플랫폼으로 만들 수 없다. Objective-C++는 크로스 플랫폼을 컴파일하지 않습니다. –

답변

2

Objective-C가이 정보를 얻지 못하도록하려면 저수준의 Quartz (그리고 그걸로 행운을 빈다.)로 뛰어 들어야한다. 당신이 objc_msgSend의 변종 중 하나를 (사용해야하기 때문에

CGGetActiveDisplayListCGDisplayScreenSize

+0

을 컴파일 할 수 없습니다. 나는 Quartz를 잊었다. –

+0

비록 이것이 런타임 라이브러리를 사용하여 가능한지 알고 싶습니다 ... –

+0

Quartz는 실제로 완전히 도움이되지 않습니다. 여전히 애플리케이션 컨텍스트를 설정해야하며 다양한 시스템 서비스와 인터페이스해야합니다.이 모두는 Foundation 및/또는 AppKit 프레임 워크의 Objective-C API를 통해서만 사용할 수 있습니다. – bbum

10
auto screen = objc_msgSend(objc_lookUpClass("NSScreen"),sel_getUid("mainScreen")); //Returns an NSScreen* 
auto frame = objc_msgSend(screen, sel_getUid("frame")); // BAD_ACCESS 

충돌에 대한 구체적인 이유입니다 :

은 당신이 될 것입니다 도움이 명령이 생각). 특히, 그렇지 않으면 스택에 맞지 않는 큰 구조체를 반환 할 수있는 것입니다.

사용 코코아는 여전히 코코아를 사용 objc_msgSend()을 통해 코코아를 사용하여 옵션

하지 않습니다!

위 코드는 Objective-C로 모든 것을 쓰는 것 이상으로 다른 플랫폼으로 이식 할 수 없습니다. Linux 또는 Windows에서 여전히 NSScreen을 사용할 수 없으므로 어느 플랫폼에서나 해당 코드 행을 컴파일 할 필요가 없습니다.

다른 플랫폼 간 라이브러리와 동일한 접근 방식을 이용하는 것이 훨씬 좋습니다.

• 그 API에서 당신의 일반적인 크로스 플랫폼 UI의 API

• 인 API를 작성, 당신은 휴대용 코드에서 할 수있는만큼을 구현

• 인터페이스 사이를 제공하는 낮은 수준의 브리징 API를 만들 휴대용 코드와 플랫폼 기술에 특정 API를 해소하는 것은이 직접 OS X 용 어에 목표 - C를 사용할 수 있도록 할

원하는 것을 각 플랫폼 구현을위한 시스템

• 여전히 크로스 플랫폼 API를 맨 위에 유지합니다.