2009-12-29 5 views

Répondre

3

Il n'y a pas d'API Cocoa pour cela. Vous devez appeler Carbon.

#import <Carbon/Carbon.h> 
#import<IOKit/IOKitLib.h> 
#import <mach/mach.h> 

NSString* UKSystemSerialNumber() 
{ 
    mach_port_t    masterPort; 
    kern_return_t   kr = noErr; 
    io_registry_entry_t  entry; 
    CFTypeRef    prop; 
    CFTypeID    propID; 
    NSString*    str = nil; 

    kr = IOMasterPort(MACH_PORT_NULL, &masterPort); 
    if(kr != noErr) 
     goto cleanup; 
    entry = IORegistryGetRootEntry(masterPort); 
    if(entry == MACH_PORT_NULL) 
     goto cleanup; 
    prop = IORegistryEntrySearchCFProperty(entry, kIODeviceTreePlane, CFSTR("serial-number"), nil, kIORegistryIterateRecursively); 
    if(prop == nil) 
     goto cleanup; 
    propID = CFGetTypeID(prop); 
    if(propID != CFDataGetTypeID()) 
     goto cleanup; 

    const char* buf = [(NSData*)prop bytes]; 
    int   len = [(NSData*)prop length], 
       x; 

    char secondPart[256]; 
    char firstPart[256]; 
    char* currStr = secondPart; // Version number starts with second part, then NULLs, then first part. 
    int  y = 0; 

    for(x = 0; x < len; x++) 
    { 
     if(buf[x] > 0 && (y < 255)) 
      currStr[y++] = buf[x]; 
     else if(currStr == secondPart) 
     { 
      currStr[y] = 0;  // Terminate string. 
      currStr = firstPart; 
      y = 0; 
     } 
    } 
    currStr[y] = 0; // Terminate string. 

    str = [NSString stringWithFormat: @"%s%s", firstPart, secondPart]; 

cleanup: 
    mach_port_deallocate(mach_task_self(), masterPort); 

    return str; 
} 

Le code ci-dessus provient de here

+0

Hi. Je reçois les erreurs de liaison suivantes en utilisant le code ci-dessus. 1. "_IORegistryEntrySearchCFProperty", référencé à partir de: 2. "_IOMasterPort", référencé à partir de: 3. "_IORegistryGetRootEntry", référencé à partir de: 4. "_IORegistryEntrySearchCFProperty", référencé à partir de: 5. "_IOMasterPort", référencé à partir de: 6. "_IORegistryGetRootEntry", référencé par: J'ai inclus les fichiers Carbon/Carbon.h, SystemConfiguration/SystemConfiguration.h. Comment résoudre ces erreurs – Shakti

+0

Vous devrez ajouter le framework 'IOKit' et' Carbon' dans votre projet – iamamac

+0

Merci beaucoup lamamac.Il fonctionne parfaitement bien. – Shakti

3

Ceci est de Technical Note TN1103

#include <CoreFoundation/CoreFoundation.h> 
#include <IOKit/IOKitLib.h> 

// Returns the serial number as a CFString. 
// It is the caller's responsibility to release the returned CFString when done with it. 
void CopySerialNumber(CFStringRef *serialNumber) 
{ 
    if (serialNumber != NULL) { 
     *serialNumber = NULL; 

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

     if (platformExpert) { 
      CFTypeRef serialNumberAsCFString = 
       IORegistryEntryCreateCFProperty(platformExpert, 
              CFSTR(kIOPlatformSerialNumberKey), 
              kCFAllocatorDefault, 0); 
      if (serialNumberAsCFString) { 
       *serialNumber = serialNumberAsCFString; 
      } 

      IOObjectRelease(platformExpert); 
     } 
    } 
} 

Je serais prudent, cependant, il mentionne quelques mises en garde de ne pas faire des hypothèses sur la longueur S/N ou quoi que ce soit

+0

Salut. Je reçois les erreurs de liaison suivantes en utilisant le code ci-dessus. 1. "_IORegistryEntrySearchCFProperty", référencé par: 2. "_IOMasterPort", référencé par: 3. "_IORegistryGetRootEntry", référencé par: 4. "_IORegistryEntrySearchCFProperty", référencé par: 5. "_IOMasterPort", référencé par: 6. "_IORegistryGetRootEntry" , référencé par: J'ai inclus les fichiers Carbon/Carbon.h, SystemConfiguration/SystemConfiguration.h. Comment résoudre ces erreurs – Shakti

Questions connexes