获取OSX HD序列号

时间:2015-07-09 22:26:05

标签: macos delphi firemonkey

我需要在OSX上获取HD序列号。到目前为止,我找不到任何Delphi的例子。

我找到了这个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

我找不到任何doc如何将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;

1 个答案:

答案 0 :(得分: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;