Перейти к содержанию
  • Регистрация
  • 0
AndreyS

Системная информация в OSX

Вопрос

Доброй ночи! 

 

Необходимо получить системную информацию в MacOS. TOSVersion дает очень скудные данные, а нужна именно более-менее уникальная постоянная информация по данному компьютеру, например ID жесткого диска, ID процессора или какой-либо другой привязанный к железу или ОС идентификатор. Для Win, iOS, Android информации в интернете предостаточно, а вот по Mac как-то нет. Может кто-нибудь сталкивался с этим и смог решить это нормальным способом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

  • 0

А не подскажете, как вы по Windows решали проблему? К чему конкретно из железа привязывались?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

В Windows есть несколько способов получения псевдоуникальных данных.

 - Можно взять ID логического диска (виндовая функция GetVolumeInformation)

 - Можно взять в реестре серийник винды и/или дату биоса

 - Кто-то берет Мас-адреса, хотя по мне это крайне неправильно.

 - На torry.net есть бесплатный набор классов  System Information Classes v.4.0 Там в демо-программе сразу показывается пара десятков параметров из которых можно составить более-менее уникальную строку для идентификации ПК (Хотя действительно полезных и уникальных там мало)))

 

Но вот, блин, для Мака ничего не могу найти(((

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Вот, что я нашел.

В маке есть консольная команда sysctl. Если ввести ее с параметром -А, то выводится список из нескольких сотен системных переменных. В принципе, если собрать в одну строку некоторые из них, то можно получить относительно уникальный неизменный параметр, который идентифицирует данное устройство. Из Delphi можно получить большинство из них (во всяком случае, некоторые я сходу получить не смог, а разбираться не стал). 

 

Как правильно получать информацию из этих переменных подробно описано здесь:

http://keeper89.blogspot.ru/2013/07/osx-ios-delphi-xe2-xe3-xe4-1.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+Keeper89+(Keeper%27s+blog)

 

Но если кто-нибудь подскажет, как получить что-то уникальное из железа, я буду очень благодарен..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
function GetHDDSerialID: String;
Const
  kIOPlatformSerialNumberKey = 'IOPlatformSerialNumber';
var
  PlatformExpert: io_service_t;
  M: CFMutableDictionaryRef;
  CFTR: CFTypeRef;
  pac: PAnsiChar;
begin
  M := IOServiceMatching('IOPlatformExpertDevice');
  PlatformExpert := IOServiceGetMatchingService(kIOMasterPortDefault, CFDictionaryRef(M));
  try
    CFTR := IORegistryEntryCreateCFProperty(PlatformExpert,
      CFSTR(kIOPlatformSerialNumberKey), kCFAllocatorDefault, 0);

    pac := CFStringGetCStringPtr(CFTR, 0);

    Result := String(AnsiString(pac));
  finally
    IOObjectRelease(PlatformExpert);
  end;
end;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Похожий контент

    • От notricky
      Собственно зазипованый файл качается, разархивируется и все файлы помещаются в папку.
      Ну а дальше приложение не запускается, хотя:
       - Настройки безопасности настроены на установку из любых мест
       - Встроенный архиватор разархивирует в папку и "из-под" него приложение запускается (до настроек безопасности просто выдавало ошибку "неизвестный автор" и "у вас настроено только на аппстор или известных авторов").
       - Разумеется при деплое приложения работают. Если их просто скопировать на флешку и потом закопировать обратно - тоже работают.
      Следовательно проблема при разархивировании программно. Что-то нужно добавить. Есть понимание что именно? 
      Сам нетривиальный код:
      var z: TZipFile; begin try {$IFDEF MSWINDOWS} RenameFile(ParamStr(0),ExtractFileName(ParamStr(0)) + '.old'); Application.ProcessMessages; {$ENDIF} SetLength(Result, 1); Result[0] := ''; z := TZipFile.Create; z.Open(ZipFile, zmRead); z.ExtractAll(ExtractTo); Result := z.FileNames; finally z.Close; z.Free; end; end; В архив кладу:
       - .app взятый с мака (а по другому никак)
       - .entitlements
       - .DS_Store 
      В надобности последнего я сильно сомневаюсь.
       
    • От rakhmet
      Для FMX-приложения понадобилось разместить кнопки с битмапами в заголовке OSX-окна:

      Здесь был, это читал, но подходящего Delphi-решения найти не смог. Есть какие-нибудь идеи?
    • От Ilya.Z
      Столкнулся с такой проблемой, (Delphi Seattle, OSX+ WIndows 10) делаю форму со своим заголовком, при установленных свойствах Transperency := True  или BorderStyle := None,
      переход в режим FullScreen не отрабатывается корректно (форма не изменяет размер на максимальный),  решил перед переходом в полноэкранный режим устанавливать   Transperency := False  и BorderStyle отличный от None, но программа вылетает, иногда сразу иногда на 2-3 раз смены параметров, причем независимо от того что меняю прозрачность или бордер.  если запускать через отладчик то вываливается на такое -
      в System.Internal.ExcUtils;
      {   RaiseSignalException is called from SignalConverter, once we've made things look   like there's a legitimate stack frame above us.  Now we will just create   an exception object, and raise it via a software raise. } procedure RaiseSignalException(ExceptionEIP: LongWord; FaultAddr: LongWord; ErrorCode: LongWord);
      begin  
        raise GetExceptionObject(ExceptionEIP, FaultAddr, ErrorCode);
      end;
      под Windows все работает нормально, без всяких выкрутасов
      для проверки можно сделать пустую форму, две кнопки , и скажем панель за которую перетаскивать форму
      и три обработчика-
      procedure TForm1.Rectangle1MouseDown(Sender: TObject; Button: TMouseButton;   Shift: TShiftState; X, Y: Single);
      begin
       if (Button = TMouseButton.mbLeft) and (y < 25) then StartWindowDrag;
      end;
      procedure TForm1.sbExpandClick(Sender: TObject);
      begin
        i f BorderStyle = TFmxFormBorderStyle.None then  
                  BorderStyle := TFmxFormBorderStyle.Single  
         else  BorderStyle := TFmxFormBorderStyle.None;
      end;
      procedure TForm17.sbFullClick(Sender: TObject);
      begin  
        FullScreen := not FullScreen;
      end;
      Может кто то сталкивался, как под OSX в рантайме менять у формы прозрачность и бордер не вываливаясь в исключения, или нормально обрабатывать переход в полноэкранный режим у прозарчной (или без стандартного заголовка) формы
      Спасибо
    • От AndreyS
      Всем доброго дня!
      После обновления OSX до El Capitan появился один эффект, который сильно мешает. В моей программе я не использую FullScreen для форм. Дело в том, что при FullScreen на OSX при нескольких открытых окнах, особенно если некоторые из них модальные бывают глюки, когда немодальное окно вдруг становится поверх всех окон, но при этом неактивным, т. к. есть модальное окно, на котором сейчас фокус. Раньше я не парился по этому поводу, т. к. мое приложение просто разворачивалось так же, как в винде. Но после обновления на El Capitan в заголовке формы отображается кнопка перехода в в FullScreen в независимости от значений соответствующих флажков у TForm. Есть ли какой-нибудь способ запретить окну переходить в FullScreen?
      Заранее спасибо.
    • От AndreyS
      Доброго всем дня. Столкнулся со следующей проблемой:
      Есть приложение для OSX, написанное на FMX (.app, упакованное в dmg). Если пользователь скачивает это приложение с сайта (сторонний сайт, не AppStore), то при запуске OSX говорит, что это приложение нельзя запускать, т. к. неизвестен издатель и пр. Так вот, что конкретно нужно сделать с этим приложением (перед деплоем или уже после), чтобы OSX не ворчала? Просто хочется заранее узнать, до того, как заплатить $99 для подключения к Developer program. Заранее спасибо.
    • От AndreyS
      Доброго всем дня! У меня в  самый неподходящий момент возникла следующая проблема:
       
      Есть приложение для Win и Mac. Работает с SQLite (Через FDQuery).
      Естественно, в базе куча данных с кириллицей. Так вот, на Win - все нормально, на одном Mac(10.10) - тоже все хорошо. Попробовал поставить на второй Mac(10.9.5) - b и вот там уже начались проблемы с кодировкой. Причем, читает из таблицы 
      S := Query.FieldByName('Title').AsString; //Без проблем а вот при записи в таблицу
      Query.ParamByName('Title').AsString := 'Заголовок'; В таблицу записывается '????????' (Причем именно запись идет неправильно). При подключении к базе Указываю, что StringFormat=Unicode.
       
      Может кто-то сталкивался с таким уже?
       
      Есть подозрения, что на 10.9.5 какая-то старая dylib, которая неправильно работает с кириллицей. тогда, наверное, нужно подключать свою к приложению, но опять же, где ее взять и как подключить? 
    • От dnekrasov
      Создаю глобальный hook на несколько событий:
      {$IFDEF MACOS} var EvtTap: CFMachPortRef; RunLoopSource: CFRunLoopSourceRef; {$ENDIF} ... procedure CreateGlobalHook; {$IFDEF MACOS} var EvtMask: UInt64; {$ENDIF} begin {$IFDEF MACOS} if EvtTap = nil then begin EvtMask := (1 shl kCGEventKeyDown) or (1 shl kCGEventFlagsChanged) or (1 shl kCGEventLeftMouseUp); EvtTap := CGEventTapCreate(kCGAnnotatedSessionEventTap, kCGTailAppendEventTap, kCGEventTapOptionListenOnly, EvtMask, @EventTapHandler, nil); RunLoopSource := CFMachPortCreateRunLoopSource(kCFAllocatorDefault, EvtTap, 0); CFRunLoopAddSource(CFRunLoopGetCurrent, RunLoopSource, kCFRunLoopCommonModes); end; CGEventTapEnable(EvtTap, 1); {$ENDIF} end; function EventTapHandler(proxy: CGEventTapProxy; type_: CGEventType; event: CGEventRef; refcon: Pointer): CGEventRef; cdecl; {$IFDEF MACOS} var iKey: Integer; iType: Integer; {$ENDIF} begin {$IFDEF MACOS} Result := event; iType := CGEventGetType(event); iKey := CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode); case iType of kCGEventFlagsChanged: ...; kCGEventLeftMouseUp: ...; kCGEventKeyDown: ...; end; {$ENDIF} end; При обработке события возникает проблема: приходят все события кроме kCGEventKeyDown В документации нашел, что kCGEventKeyDown и kCGEventKeyUp приходят только в том случае если приложение запущено от root-а или внесено в список "System Preferences->Security & Privacy->Privacy->Accessibility"
       
      Может кто знает как мне программно получить доступ к этим событиям?
    • От AndreyS
      Друзья, подскажите, пожалуйста, каким образом можно ассоциировать программу для MacOS c с определенным типом файлов? Таким образом, чтобы при двойном клике выбранный файл открывался именно в этой программе. Для Windows это делается просто, прописываешь в реестр нужные ключи (при установке) и обрабатываешь через ParamStr(1). Но для маков, насколько я знаю, это все происходит по-другому сценарию. В инете нашел инструкцию как это сделать (https://delphihaven.wordpress.com/2012/08/10/associating-a-file-type-on-osx-part1/), но там для XE2, сейчас многое уже поменялось даже в реализации основного интерфейса от которого идет вся работа. Может кто-то знает как теперь правильно все это реализовать?
       
      Заранее благодарен.
    • От dnekrasov
      Подскажите, пожалуйста, как реализовать глобальные хоткеи для своего приложения в OS X
    • От SerhioUser
      Здравствуйте всем!
       
      Проверял на OS X - Mountain Lion 10.8.3
       
      После Map/Unmap-обновления картинки, изображение на 3D-форме с TImage3D не обновляется.
       
      Вот простой пример - TestMap.zip - по таймеру заносит шум в TImage3D.Bitmap.
      В XE7 работает и под Win32 и под OSX.
      В XE8 под win32 работает, а под OSX отображает белый фон. Если над формой провести каким-то другим окном, то в этом месте картинка, т.е. ее часть (в нашем случае шум), отрисовывается. Тоже самое если нашу форму вывести за экран и потянуть обратно - в местах появления формы отображается часть нашей картинки (шума).
       
      BeginUpdate/EndUpdate и Repaint результата не дали.
       
      XE8 Update1 - тоже самое.
       
      Как сие побороть?
       
      (Обычный TImage отрабатывает нормально).
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...