Форум » GUI » Серийный номер » Ответить

Серийный номер

Pasha: Как средствами winapi считать Mac-адрес сетевушки, серийный номер диска или еще что-нибудь подобное понятно для каких целей

Ответов - 35, стр: 1 2 All

gfilatov: MAC адрес можно определить так (должно работать под Винды и Unix): #include "hbapi.h" #include <stdio.h> #if defined(HB_OS_UNIX) #include <unistd.h> #include <sys/ioctl.h> #include <netinet/in.h> #include <linux/if.h> #elif defined(HB_OS_WIN_32) #include <windows.h> #include <wincon.h> #include <time.h> #endif #define LEN_MACA_STR 12 long mac_addr_sys ( u_char *cResult ); HB_FUNC( GETMACADDR ) { long iResult ; u_char cResult[LEN_MACA_STR+1]; iResult = mac_addr_sys( cResult ); if ( iResult == 0 ) { hb_retclen( cResult, LEN_MACA_STR ); } else { hb_retc( "" ); } } #if defined(HB_OS_WIN_32) typedef struct _ASTAT_ { ADAPTER_STATUS adapt; NAME_BUFFER NameBuff [30]; } ASTAT, * PASTAT; ASTAT Adapter; #endif long mac_addr_sys ( u_char *cResult ) { #if defined(HB_OS_UNIX) struct ifreq ifr ; struct ifreq *IFR; struct ifconf ifc; char buf[1024]; int s, i; int iFound = 0; s = socket(AF_INET, SOCK_DGRAM, 0); if (s==-1) { return -1; } ifc.ifc_len = sizeof(buf); ifc.ifc_buf = buf; ioctl(s, SIOCGIFCONF, &ifc); IFR = ifc.ifc_req; for (i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; IFR++) { strcpy(ifr.ifr_name, IFR->ifr_name); if (ioctl(s, SIOCGIFFLAGS, &ifr) == 0) { if (! (ifr.ifr_flags & IFF_LOOPBACK)) { if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) { iFound = 1; break; } } } } close(s); if (iFound) { for (i=0;i<6;++i) { sprintf( cResult+(i*2), "%2.2x", ifr.ifr_hwaddr.sa_data ); } } else { return -1; } return 0; } #elif defined(HB_OS_WIN_32) NCB Ncb; UCHAR cRetCode; char NetName[50]; LANA_ENUM lenum; int i; memset( &Ncb, 0, sizeof(Ncb) ); Ncb.ncb_command = NCBENUM; Ncb.ncb_buffer = (UCHAR *)&lenum; Ncb.ncb_length = sizeof(lenum); cRetCode = Netbios( &Ncb ); if ( lenum.length < 1 ) { return -1; } memset( &Ncb, 0, sizeof(Ncb) ); Ncb.ncb_command = NCBRESET; Ncb.ncb_lana_num = lenum.lana[0]; cRetCode = Netbios( &Ncb ); memset( &Ncb, 0, sizeof (Ncb) ); Ncb.ncb_command = NCBASTAT; Ncb.ncb_lana_num = lenum.lana[0]; strcpy( Ncb.ncb_callname, "* " ); Ncb.ncb_buffer = (char *) &Adapter; Ncb.ncb_length = sizeof(Adapter); cRetCode = Netbios( &Ncb ); if ( cRetCode == 0 ) { for (i=0;i<6;++i) { sprintf( cResult+(i*2), "%02x", Adapter.adapt.adapter_address ); } return 0; } return -1; } #else return -1; } #endif С серийным номером диска еще проще: *-------------------------------------- Function GetVolumeSerialNumber(cPath) *-------------------------------------- Private nSerialNumber,cFatName:=space(30),nFlag GetVolumeInformation(cPath,NIL,nSerialNumber,NIL,56,nFlag,cFATName ) Return abs(nSerialNumber) #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" HB_FUNC( GETVOLUMEINFORMATION ) { char *VolumeNameBuffer = (char *) hb_xgrab( MAX_PATH ) ; DWORD VolumeSerialNumber ; DWORD MaximumComponentLength ; DWORD FileSystemFlags ; char *FileSystemNameBuffer = (char *) hb_xgrab( MAX_PATH ) ; BOOL bRet; bRet = GetVolumeInformation( ISNIL(1) ? NULL : (LPCTSTR) hb_parc(1) , (LPTSTR) VolumeNameBuffer , MAX_PATH , &VolumeSerialNumber , &MaximumComponentLength , &FileSystemFlags , (LPTSTR)FileSystemNameBuffer , MAX_PATH ) ; if ( bRet ) { if ( ISBYREF( 2 ) ) hb_storc ((char *) VolumeNameBuffer, 2 ) ; if ( ISBYREF( 3 ) ) hb_stornl( (LONG) VolumeSerialNumber, 3 ) ; if ( ISBYREF( 4 ) ) hb_stornl( (LONG) MaximumComponentLength, 4 ) ; if ( ISBYREF( 5 ) ) hb_stornl( (LONG) FileSystemFlags, 5 ); if ( ISBYREF( 6 ) ) hb_storc ((char *) FileSystemNameBuffer, 6 ); } hb_retl(bRet); hb_xfree( VolumeNameBuffer ); hb_xfree( FileSystemNameBuffer ); } #pragma ENDDUMP

Dima: Так до кучи. Немного похожая тема вот тут терлась http://fivetechsoft.com/forums/viewtopic.php?t=4412

Pasha: Спасибо, то что надо


Andrey: gfilatov пишет: С серийным номером диска еще проще: *-------------------------------------- Function GetVolumeSerialNumber(cPath) *-------------------------------------- Private nSerialNumber,cFatName:=space(30),nFlag GetVolumeInformation(cPath,NIL,nSerialNumber,NIL,56,nFlag,cFATName ) Return abs(nSerialNumber) ........ И Т.Д. Не работает что-то ? Compiling... Z:\xHarbour\bin\harbour hdd-serial.prg -n -q0 -gc -iZ:\xHarbour\include -p -w hdd-serial.prg(14) Warning W0001 Ambiguous reference: 'CFATNAME' hdd-serial.prg(15) Warning W0001 Ambiguous reference: 'NSERIALNUMBER' hdd-serial.prg(15) Warning W0001 Ambiguous reference: 'NFLAG' hdd-serial.prg(15) Warning W0001 Ambiguous reference: 'CFATNAME' hdd-serial.prg(16) Warning W0001 Ambiguous reference: 'NSERIALNUMBER' Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland hdd-serial.c: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland W:\FOND9\UTIL\HDD>hdd-serial.exe Error BASE/1089 Argument error: ABS Arguments: ( [ 1] = Type: U) Error at ...: ABS(0) in Module: Called from : GETVOLUMESERIALNUMBER(16) in Module: hdd-serial.prg Called from : MAIN(4) in Module: hdd-serial.prg

Dima: Andrey Volserial из CT покажет тебе ту же инфу.

Andrey: А как определить тип процессора ? Хотя бы считать из реестра !

Dima: Andrey Посмотри пример в MiniGui SAMPLES\ADVANCED\SYSINFO\ У меня Минигуи старый , аж 2004 года , возможно с тех пор появились и новые примеры в этом плане.

Andrey: Точно, нашел такой. Но так как пишу на хХарборе без ГУИ, то выдрал оттуда нужные мне функции. Пример здесь: /* * MINIGUI - Harbour Win32 GUI library Demo * Copyright 2003-06 Grigory Filatov <gfilatov@freemail.ru> * MiniGui SAMPLES\ADVANCED\SYSINFO.PRG */ #include "common.ch" /* Registry related values */ #define HKEY_CLASSES_ROOT 0x80000000 #define HKEY_CURRENT_USER 0x80000001 #define HKEY_LOCAL_MACHINE 0x80000002 #define HKEY_USERS 0x80000003 #define HKEY_PERFORMANCE_DATA 0x80000004 #define HKEY_CURRENT_CONFIG 0x80000005 #define HKEY_DYN_DATA 0x80000006 #define NTRIM( n ) LTrim( Str( n ) ) FUNCTION MAIN() LOCAL lWinNT := IsWinNT() ? CPUName() + " " + IF(lWinNT, "[~", "") + NTRIM( GetCPUSpeed() ) + " MHz" + IF(lWinNT, "]", "") RETURN NIL *--------------------------------------------------------* Function CPUName() *--------------------------------------------------------* Local cName := "" IF lWinNT cName := Ltrim( GetRegVar( HKEY_LOCAL_MACHINE, "HARDWARE\DESCRIPTION\System\CentralProcessor\0", "ProcessorNameString" ) ) ELSE cName := GetCPU() ENDIF return cName *--------------------------------------------------------* Function IsWinNT() *--------------------------------------------------------* RETURN OS_ISWINNT() *--------------------------------------------------------* STATIC FUNCTION GETREGVAR(nKey, cRegKey, cSubKey, uValue) *--------------------------------------------------------* LOCAL oReg, cValue := "" DEFAULT nKey TO HKEY_CURRENT_USER DEFAULT uValue TO "" oReg := TReg32():Create(nKey, cRegKey, .f.) cValue := oReg:Get(cSubKey, uValue) oReg:Close() RETURN cValue Пришлось прицепить библиотеку cputype.lib для функции GetCPU() А дальше облом, нужен класс TReg32(), нашел в h_registry.prg, опять прицепил к проекту. Еще больше ошибок.... Error: Unresolved external '_HB_FUN_REGCLOSEKEY' referenced from W:\UTIL\ Error: Unresolved external '_HB_FUN_REGOPENKEYEXA' referenced from W:\UTI Error: Unresolved external '_HB_FUN_MSGSTOP' referenced from W:\UTIL\CPU\ Error: Unresolved external '_HB_FUN_REGCREATEKEY' referenced from W:\UTIL Error: Unresolved external '_HB_FUN_REGQUERYVALUEEXA' referenced from W:\ Error: Unresolved external '_HB_FUN_REGSETVALUEEXA' referenced from W:\UT Error: Unresolved external '_HB_FUN_REGDELETEVALUEA' referenced from W:\U Error: Unresolved external '_HB_FUN_REGDELETEKEY' referenced from W:\UTIL Блин, нельзя ли укоротить ВСЕ ЭТО хозяйство под хХарбор ???? Кто поможет ???

Петр: Andrey пишет: Блин, нельзя ли укоротить ВСЕ ЭТО хозяйство под хХарбор ???? Кто поможет ??? Помогите себе сами, попробуйте узнать о хХарбор больше, чем вы знаете [pre2]#define HKEY_LOCAL_MACHINE 0 proc main ? GetRegistry( HKEY_LOCAL_MACHINE, "HARDWARE\DESCRIPTION\System\CentralProcessor\0", "ProcessorNameString" ) return[/pre2]

Andrey: Сделал тест под хХарбор. Исходники здесь http://slil.ru/29281289 Вопрос остается прежним: Как укоротить ВСЕ ЭТО хозяйство под хХарбор ???

Dima: Andrey пишет: Как укоротить ВСЕ ЭТО хозяйство под хХарбор ??? Петр пишет: #define HKEY_LOCAL_MACHINE 0 proc main ? GetRegistry( HKEY_LOCAL_MACHINE, "HARDWARE\DESCRIPTION\System\CentralProcessor\0", "ProcessorNameString" ) return Читал ответ Петра ?

Andrey: Петр пишет: Помогите себе сами, попробуйте узнать о хХарбор больше, чем вы знаете Спасибо Петр ! Направление понял. Только что-то сайт под тормаживает, тема Петра получилась выше, т.е. перед тем как я пример последний записывал. И поэтому сразу не заметил ответ. Благо Дима подсказал.... Ну что без него мы делали бы...

Andrey: Сделал укороченный пример но только для NT и выше: /* Registry related values Winreg.ch */ /* Help for xHarbour */ #define HKEY_LOCAL_MACHINE 0 #define HKEY_CLASSES_ROOT 1 #define HKEY_CURRENT_USER 2 #define HKEY_CURRENT_CONFIG 3 #define HKEY_LOCAL_MACHINE 4 #define HKEY_USERS 5 FUNCTION MAIN() LOCAL lWinNT := IsWinNT() CLEAR SCREEN ? " Test functions CPU through the register for [x]Harbour." ? " Verchenko A.G., Dmitrov an e-mail:verchenkoag@gmail.com is written" ? PADC("",70,"-") ? " " + Version() + " - " + hb_compiler() ? ? " " + MyCPUName() + " " + IF(lWinNT, "[~", "") + MyGetCPUSpeed() + " MHz" + IF(lWinNT, "]", "") ? wait RETURN NIL *--------------------------------------------------------* Function IsWinNT() *--------------------------------------------------------* RETURN OS_ISWINNT() *--------------------------------------------------------* Function MyCPUName() *--------------------------------------------------------* LOCAL lWinNT := IsWinNT(), cName := "" IF lWinNT cName := Ltrim( GetRegistry( HKEY_LOCAL_MACHINE, "HARDWARE\DESCRIPTION\System\CentralProcessor\0", "ProcessorNameString" ) ) ELSE cName := "None CPU for Win9x" ENDIF return cName *--------------------------------------------------------* Function MyGetCPUSpeed() *--------------------------------------------------------* LOCAL lWinNT := IsWinNT(), cName, n := 0 IF lWinNT n := GetRegistry( HKEY_LOCAL_MACHINE, "HARDWARE\DESCRIPTION\System\CentralProcessor\0", "~MHz" ) cName := LTrim( Str( n+1 ) ) ELSE cName := "None CPUSpeed for Win9x" ENDIF return cName Может кому пригодиться .... Спасибо всем за помощь .....

Dima: Andrey пишет: И поэтому сразу не заметил ответ Для этого есть Темы с новыми сообщениями

Andrey: Сделал укороченный пример но только для NT и выше: /* Registry related values Winreg.ch */ /* Help for xHarbour */ #define HKEY_LOCAL_MACHINE 0 #define HKEY_CLASSES_ROOT 1 #define HKEY_CURRENT_USER 2 #define HKEY_CURRENT_CONFIG 3 #define HKEY_LOCAL_MACHINE 4 #define HKEY_USERS 5 FUNCTION MAIN() LOCAL lWinNT := IsWinNT() CLEAR SCREEN ? " Test functions CPU through the register for [x]Harbour." ? PADC("",70,"-") ? " " + Version() + " - " + hb_compiler() ? ? " " + MyCPUName() + " " + IF(lWinNT, "[~", "") + MyGetCPUSpeed() + " MHz" + IF(lWinNT, "]", "") ? ; ? ; ? ; ? wait RETURN NIL *--------------------------------------------------------* Function IsWinNT() RETURN OS_ISWINNT() *--------------------------------------------------------* Function MyCPUName() LOCAL lWinNT := IsWinNT(), cName := "" IF lWinNT cName := Ltrim( GetRegistry( HKEY_LOCAL_MACHINE, "HARDWARE\DESCRIPTION\System\CentralProcessor\0", "ProcessorNameString" ) ) ELSE cName := "None CPU for Win9x" ENDIF return cName *--------------------------------------------------------* Function MyGetCPUSpeed() LOCAL lWinNT := IsWinNT(), cName, n := 0 IF lWinNT n := GetRegistry( HKEY_LOCAL_MACHINE, "HARDWARE\DESCRIPTION\System\CentralProcessor\0", "~MHz" ) cName := LTrim( Str( n+1 ) ) ELSE cName := "None CPUSpeed for Win9x" ENDIF return cName Оказывается работает, только под ХР !!! А под Win2000 - вылетает ! Где ошибка ? Может разные ветки реестра ?

Dima: Andrey пишет: Где ошибка ? Может разные ветки реестра ? Тут написано для каких осей http://msdn.microsoft.com/ru-ru/library/system.security.permissions.registrypermission%28VS.90%29.aspx

Dima: Andrey пишет: А под Win2000 - вылетает ! Варианты: 1. Проверь ручками наличие этого ключа 2. Не достаточно прав , заюзай логин админа ;)

Andrey: Dima пишет: Варианты: 1. Проверь ручками наличие этого ключа 2. Не достаточно прав , заюзай логин админа ;) Нету под руками Win2000. Ошибку мне прислали из другого города. Эмулятор 2000 на ноутбуке не встанет, да и дорого сейчас тянуть дистрибутив. Трафик дорогой. А что делать если у юзера нет прав для чтения ключа ?

Dima: Andrey Проверь сам ;) Есть отличная прога TeamViewer. Ставишь ее у себя и даешь клиенту , клиент сообщает тебе номер компа и пароль , забиваешь в TeamViewer его данные и ты уже на его компе. Дистрибутив не требующий инсталляции налить куда то ?

Andrey: Dima пишет: Есть отличная прога TeamViewer Спасибо Дима ! Попробую !



полная версия страницы