2016-07-29 8 views
2

私はC++でプログラムの情報を次取得するにはどうすればよい:OS Xボード-ID情報を取得する方法をプログラム

これは、Mac OSXでのターミナルコマンドです:

ioreg -c IOPlatformExpertDevice | awk '/board-id/ {print $4}' | awk -F '\"' '{print $2}' 

私は情報を取得するためにIOKitのライブラリを使用IOPlatformSerialNumberやPlatformUUIDなどの情報が含まれます。しかし、 "board-id"に対応するキーが見つかりませんでした。

+0

:例えば、CFGetTypeID()を使用してタイプをチェックし、あなたは 'パイプ()'とあなたの質問からのコマンドラインを使用することができます。 –

+1

'popen()'確かに? –

+1

@MarkSetchell申し訳ありませんがミスタイプです。 –

答えて

1

C++コードのIOPlatformExpertDeviceへのハンドルがio_service_tの場合は、IORegistryEntryCreateCFProperty()関数を使用して「board-id」プロパティを取得できます。 CFDataオブジェクトを受け取ることを期待しますが、ヌルと正しいタイプIDを確認してください。次に、通常のCFDataメソッドを使用して、必要な形式でデータを抽出します。

あなたはIOServiceのはまだ扱う持っていない場合は、あなたがIOServiceGetMatchingService()のいずれかを使用してそこに得ることができる必要があります(私は。それが唯一のIOPlatformExpertDeviceインスタンスがあるだろうと仮定しても安全です望んでいる)、または取得するためにIORegistryGetRootEntry()を使用してIORegistryグラフをIORegistryEntryGetChildEntry()またはそれに類似するプラットフォームエキスパートデバイスに移動してください。

board-idプロパティは、名前のシンボリック定数を持っていないとして、あなたはそれをハードコーディングする必要があります:プロパティ値がCFNumberを含む様々なタイプを、取ることができること

CFTypeRef board_id_property = IORegistryEntryCreateCFProperty(
    platform_expert_device, CFSTR("board-id"), kCFAllocatorDefault, 0); 

注意、CFBooleanCFStringCFDataCFArrayおよびCFDictionaryがあり、型が期待どおりでない場合、またはNULLが返された場合(プロパティが存在しない場合)は対処する準備が必要です。少なくともリゾートのよう

if (board_id_property != NULL && CFGetTypeID(board_id_property) == CFDataGetTypeID()) 
{ 
    CFDataRef board_id_data = (CFDataRef)board_id_property; 
    // safe to use CFData* functions now 
    ... 

    CFRelease(board_id_property); 
} 
else 
{ 
    // Unexpected, do error handling. 
    ... 

    if (board_id_property != NULL) 
     CFRelease(board_id_property); 
} 
+0

私はio_service_tハンドルを持っていますが、 "board-id"のキーは存在しません。これは、kIOPlatformSerialNumberKeyのためのキーが存在するためです。 –

+0

これは単なる文字列で、OS Xソースコードのさまざまなビットでハードコードされているようですが、記号定数はありません。生の文字列を使用するだけです。 – pmdj

+0

だから私はあなたが提案したもの、つまり生の文字列を使ってみました。次の2回の試行は、 " - [__ NSCFData _fastCharacterContents]:インスタンスに送信された認識できないセレクタ..."というエラーで失敗しました:IORegistryEntryCreateCFProperty(platformExpert、CFSTR( "board-id")、kCFAllocatorDefault、0)&IORegistryEntryCreateCFProperty(platformExpert、CFSTR( "manufacturer" )、kCFAllocatorDefault、0)。ただし、IORegistryEntryCreateCFProperty(platformExpert、CFSTR( "IOPolledInterface")、kCFAllocatorDefault、0)は成功します。 "ioreg -rd1 -c IOPlatformExpertDevice"端末コマンドを実行すると、これらの変数の命名に違いがあります。 –

関連する問題