Цель C Runtime для доступа к размерам экрана

Я работаю над проектом, в котором использование Какао и Objective 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

Использование Какао не вариант, и на самом деле Carbon больше не поддерживается.
Я надеюсь, что кто-то знаком с Objc Runtime и способен решить эту проблему.

1

Решение

Если вы действительно хотите избежать получения Objective-C при получении этой информации, вам нужно погрузиться в низкоуровневый кварц (и удачи в этом!).

Я думаю, что команды, которые вам помогут, будут:

CGGetActiveDisplayList
а также
CGDisplayScreenSize

2

Другие решения

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 (). В частности, тот, который может возвращать большие структуры, которые в противном случае не помещаются в стек.

Использование какао не вариант

Используя Какао через objc_msgSend() все еще использует какао!

Приведенный выше код не более переносим на любую другую платформу, чем просто записывает все как Objective-C. Вы все еще не можете использовать NSScreen в Linux или Windows и, следовательно, нет смысла компилировать указанные строки кода на любой платформе.

Вам гораздо лучше использовать тот же подход, что и в других кроссплатформенных библиотеках.

• создать API, который является вашим универсальным API кросс-платформенного интерфейса

• в рамках этого API реализуйте как можно больше в переносимом коде

• создать низкоуровневый API-интерфейс моста, который обеспечивает интерфейс между переносимым кодом и системой

• для каждой платформы реализовать тот API-интерфейс моста, который специфичен для желаемой технологии платформы

Это позволит вам использовать Objective-C непосредственно в OS X, сохраняя кросс-платформенный API на вершине.

10

По вопросам рекламы [email protected]