2015-07-09 9 views
-1

Мне нужно получить серийный номер HD на OSX. До сих пор я не мог найти примеры Delphi.Получить серийный номер OSX HD

Я нашел этот пример C++ Builder:

AnsiString GetSerialNumber() 
{ 
    AnsiString result; 

    io_service_t platformExpert = 
     IOServiceGetMatchingService(kIOMasterPortDefault, 
      IOServiceMatching("IOPlatformExpertDevice")); 

    if (platformExpert) { 
     CFTypeRef serialNumberAsCFString = 
      IORegistryEntryCreateCFProperty(platformExpert, 
              CFSTR(kIOPlatformSerialNumberKey), 
              kCFAllocatorDefault, 0); 
     if (serialNumberAsCFString) 
     { 
      result = CFStringGetCStringPtr((CFStringRef) serialNumberAsCFString, 0); 
      CFRelease(serialNumberAsCFString); 
     } 

     IOObjectRelease(platformExpert); 
    } 

    return result; 
} 

Я использую XE7.

Помогите портировать это в Delphi, будем высоко оценены.

@David - в Macapi.IOKit, IOServiceGetMatchingService пункт CFDictionaryRef в то время как IOServiceMatching точка на CFMutableDictionaryRef.

Не удалось найти какой-либо документ, как отличать CFMutableDictionaryRef с CFDictionaryRef.

Вот что я придумал до сих пор:

function GetMacSerialNo: String; 
    Const 
    kIOPlatformSerialNumberKey = 'IOPlatformSerialNumber'; 
    Var 
    PlatformExpert: io_service_t; 
    M: CFMutableDictionaryRef; 
    SerialNumberAsCFString: CFTypeRef; 
    _AnsiChar: PAnsiChar; 
begin 

    M := IOServiceMatching('IOPlatformExpertDevice'); 

    PlatformExpert := IOServiceGetMatchingService(kIOMasterPortDefault,M); --> E2010 Incompatible types: 'CFDictionaryRef' and 'CFMutableDictionaryRef' 

    SerialNumberAsCFString := IORegistryEntryCreateCFProperty(PlatformExpert, 
          CFSTR(kIOPlatformSerialNumberKey),kCFAllocatorDefault,0); 

    _AnsiChar := CFStringGetCStringPtr(SerialNumberAsCFString,0); 

    Result := String(AnsiString(_AnsiChar)); 

end; 
+0

Посмотрите на 'FileSystemAttributes' в' System.SysUtils' (если у вас есть Delphi Professional или выше). Хотя он не находит идентификатор тома, он показывает, как получить информацию об объеме в OS X. – Hans

+0

@Hans - Спасибо, но FSCatalogInfo не предоставляет никакой информации об идентификаторе тома. – DanielH

+1

Вы, кажется, просите нас перенести код для вас. Что мешает вам писать код? –

ответ

1

Оказывается Кастинг CFMutableDictionaryRef проще, чем я думал. Вот рабочий код для тех, кому это может понадобиться.

Function GetMacSerialNo: String; 
    Const 
    kIOPlatformSerialNumberKey = 'IOPlatformSerialNumber'; 
    Var 
    PlatformExpert: io_service_t; 
    M: CFMutableDictionaryRef; 
    SerialNumberAsCFString: CFTypeRef; 
    _AnsiChar: PAnsiChar; 
begin 

    M := IOServiceMatching('IOPlatformExpertDevice'); 
    PlatformExpert := IOServiceGetMatchingService(kIOMasterPortDefault,CFDictionaryRef(M)); 

    SerialNumberAsCFString := IORegistryEntryCreateCFProperty(PlatformExpert, 
          CFSTR(kIOPlatformSerialNumberKey),kCFAllocatorDefault,0); 

    _AnsiChar := CFStringGetCStringPtr(SerialNumberAsCFString,0); 

    Result := String(AnsiString(_AnsiChar)); 

    IOObjectRelease(PlatformExpert); 

End; 
Смежные вопросы