我需要在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;
答案 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;