Как можно попроще получить любое произвольное число?Но что бы оно было уникальным для каждого компьютера на котором будет выполнятся такой код.
1) получить бренд-индекс процессора (cpuid функции с 0x80000002 по 0x80000004) 2) получить серийный номер винта (http://forum.codenet.ru/archive/index.php/t-9911.html) сложить 2 строки, взять от них хеш и получите уникальное число
Я просил попроще а не на как минимум 150 строчек кода Мне не принципиально что число может менятся.Мне главное что бы возможность его повторения максимально стремилась к нулю. Вот нашол код получения мака сетевой Code: //---------------------- typedef DWORD (CALLBACK* GetadAptInfo)(PIP_ADAPTER_INFO, PULONG); HINSTANCE iphlpapi; iphlpapi=LoadLibrary("iphlpapi.dll"); if (!iphlpapi) { ShowMessage( "Error of upload iphlpapi.dll!"); Abort(); } GetadAptInfo GetAdaptersInfo; GetAdaptersInfo = ( GetadAptInfo) GetProcAddress( iphlpapi, "GetAdaptersInfo"); ULONG adapter_info_size = 0; PIP_ADAPTER_INFO pip_a_i = NULL; GetAdaptersInfo( pip_a_i, &adapter_info_size ); pip_a_i = (PIP_ADAPTER_INFO) malloc( sizeof(char) * adapter_info_size); if ( GetAdaptersInfo( pip_a_i, &adapter_info_size )) { ShowMessage("Error in GetAdaptersInfo!"); free(pip_a_i); Abort(); } while (pip_a_i) { Memo1->Lines->Add("Adapter's CLSID: " + (String)pip_a_i->AdapterName); Memo1->Lines->Add ("Name; " + (String)pip_a_i->Desc_ription); Memo1->Lines->Text = Memo1->Lines->Text + "MAC address: "; for (int i = 0; i < pip_a_i->AddressLength; i++) { Memo1->Lines->Text = Memo1->Lines->Text + ((unsigned char)pip_a_i->Address[i]) + "."; } Memo1->Lines->Add(""); pip_a_i = pip_a_i->Next; } free(pip_a_i); FreeLibrary(iphlpapi); Но есть одна проблемка У меня он почему то выводит информацию только по виртуальным сетевухам vmware А реальной физической почему то невидет
там не 150 строчек получиться, а максимум 10)) да и ваще если ты умеешь кодить, то как то глупо задавать такие вопросы!
Чтобы получить строку бренд-индекс, надо последовательно вызывать команду cpuid со значениями в eax = 0x80000002 , 0x80000003,0x80000004 . В результате в регистрах eax, ebx, ecx, edx именно в таком порядке вы будете получать по 16 байт [4x4] строки. И того, для хранения самого индекса вам потребуется строка длиной 48 ascii символов и завершающий 0 и того 49 символов (как видно это как раз максимально возможное значение). В сорцах моего amd-cpu-info эта функция есть Code: VOID WINAPI GetBrandStr(PCHAR szBrand) { for(DWORD arg = 0x80000002,i=0;arg<=0x80000004;arg++,i+=15) { _asm { mov edi,szBrand mov eax,arg cpuid mov esi,i mov dword ptr [edi+esi],eax mov dword ptr [edi+3+esi],ebx mov dword ptr [edi+7+esi],ecx mov dword ptr [edi+11+esi],edx } } } Пример вызова Code: CHAR cBrandInd[49]; RtlZeroMemory(&cBrandInd,49); GetBrandStr(cBrandInd); MessageBoxA(0,cBrandInd,"Processor",0); Как пример "AMDAthlon(tm) 64 X Dual Core Processr 5200+" 2ТС как мне кажется, это довольно простой способ - все, что связано с cpuid. У этой команды еще имеется большое количество различных функций с помощью которых можно узнать возможности конкретного процессора. Правда, если не использовать с другими параметрами оборорудования, то не особо случайно получиться, да вы и сами понимаете желаю удачи
по мне проще сгенерить ID через rdtsc и сохранить в реестре. Хотя способ с номером тома системного диска - тож очень хорош.
>>Я читал что такое способ не работает на старых процессорах типа пентиум 3 или атлон ХР Нет проблемы добавить небольшую проверку. Если функция cpuid 80000000h вернет в eax значение <80000004h, то вывод строки бренд-индекса не поддерживается. И тогда можно сделать по старинке - вывод идентификатора с помощью функции 0.
если юзать cpuid, то правилом хорошего тона предпологается или обернуть вызов в сех иди проверить поддержку рпоцессором такой инструкции: Code: function IsCPUID(): Boolean; register; asm PUSHFD {save EFLAGS to stack} POP EAX {store EFLAGS in EAX} MOV EDX, EAX {save in EDX for later testing} XOR EAX, $200000; {flip ID bit in EFLAGS} PUSH EAX {save new EFLAGS value on stack} POPFD {replace current EFLAGS value} PUSHFD {get new EFLAGS} POP EAX {store new EFLAGS in EAX} XOR EAX, EDX {check if ID bit changed} JZ @exit {no, CPUID not available} MOV AL, TRUE {yes, CPUID is available} @exit: end; как вариант, получать имя компа/юзера
я вот сейчас у интелов глянула в мане, там до 486 cpuid не поддерживается, как и у амд (там у них кажись тоже с 486 появилось). И у себя не проверяла в кодесе, температуру-то с amd64 можно мерить через Thermtrip Status Register... В общем случае, конечно же, проверка не помешает. ЗЫ Хотя что тут говорить, тс уже выбрал удобный для себя способ
Вопрос зачем? Они не уникальны. А вообще получить можно из BIOS _ttp://www.codeproject.com/KB/system/SMBIOS_Peek.aspx