بعضی نرم افزارها وقتی نصب میشه یه شماره سریال میده که باید آنرا به شرکت مورد نظر اعلام کنی تا شماره سریال اصلی را بده ( ظاهرا با توجه به شماره سریال هارد این کار را میکند ) اگه دوستان اینچنین کدی نوشته اند . لطفا سورس انرا اینجا بگذارند .
با تشکر
بعضی نرم افزارها وقتی نصب میشه یه شماره سریال میده که باید آنرا به شرکت مورد نظر اعلام کنی تا شماره سریال اصلی را بده ( ظاهرا با توجه به شماره سریال هارد این کار را میکند ) اگه دوستان اینچنین کدی نوشته اند . لطفا سورس انرا اینجا بگذارند .
با تشکر
کاری نداره با استفاده از کامپوننت MMSystem Information شماره سریال هارد رو بخون و بعد خودت یک فرمول براش
بساز. یک ضربی یا تقسیمی.
Source خوندن شماره سریال هارد هم تو اینترنت پر است.
موفق باشید
:flower:
یا می تونی با یک الگوریتم اول عددی رو به بیننده بدی .
دوم اونو با الگوریتم دیگه تغییر بدی تا بخونش .
:موفق:
اگر جستجو میکردی قبلا مطرح شده بود
کد زیر را آقای کرامتی زحمتش رو کشیدند که میتونه شماره سریال هار رو به دست بیاری در اکثر کد های دیگر با فرمت کردن درایو کد تولید شده تغییر میکنه ولی در کد زیر شماره سریال واقعی هارد دیسک رو به شما میده که با فرمت کردن و پارتیشن بندی تغییر نمیکنه
//for windows 98 copy Smartvsd.vxd in %WINDIR%/System
program IdeSN;
// PURPOSE: Simple console application that extract first IDE disk serial number.
{$APPTYPE CONSOLE}
uses
Windows,
SysUtils; // only for Win32Platform and SysErrorMessage
//-------------------------------------------------------------
function GetIdeDiskSerialNumber : String;
type
TSrbIoControl = packed record
HeaderLength : ULONG;
Signature : Array[0..7] of Char;
Timeout : ULONG;
ControlCode : ULONG;
ReturnCode : ULONG;
Length : ULONG;
end;
SRB_IO_CONTROL = TSrbIoControl;
PSrbIoControl = ^TSrbIoControl;
TIDERegs = packed record
bFeaturesReg : Byte; // Used for specifying SMART "commands".
bSectorCountReg : Byte; // IDE sector count register
bSectorNumberReg : Byte; // IDE sector number register
bCylLowReg : Byte; // IDE low order cylinder value
bCylHighReg : Byte; // IDE high order cylinder value
bDriveHeadReg : Byte; // IDE drive/head register
bCommandReg : Byte; // Actual IDE command.
bReserved : Byte; // reserved. Must be zero.
end;
IDEREGS = TIDERegs;
PIDERegs = ^TIDERegs;
TSendCmdInParams = packed record
cBufferSize : DWORD;
irDriveRegs : TIDERegs;
bDriveNumber : Byte;
bReserved : Array[0..2] of Byte;
dwReserved : Array[0..3] of DWORD;
bBuffer : Array[0..0] of Byte;
end;
SENDCMDINPARAMS = TSendCmdInParams;
PSendCmdInParams = ^TSendCmdInParams;
TIdSector = packed record
wGenConfig : Word;
wNumCyls : Word;
wReserved : Word;
wNumHeads : Word;
wBytesPerTrack : Word;
wBytesPerSector : Word;
wSectorsPerTrack : Word;
wVendorUnique : Array[0..2] of Word;
sSerialNumber : Array[0..19] of Char;
wBufferType : Word;
wBufferSize : Word;
wECCSize : Word;
sFirmwareRev : Array[0..7] of Char;
sModelNumber : Array[0..39] of Char;
wMoreVendorUnique : Word;
wDoubleWordIO : Word;
wCapabilities : Word;
wReserved1 : Word;
wPIOTiming : Word;
wDMATiming : Word;
wBS : Word;
wNumCurrentCyls : Word;
wNumCurrentHeads : Word;
wNumCurrentSectorsPerTrack : Word;
ulCurrentSectorCapacity : ULONG;
wMultSectorStuff : Word;
ulTotalAddressableSectors : ULONG;
wSingleWordDMA : Word;
wMultiWordDMA : Word;
bReserved : Array[0..127] of Byte;
end;
PIdSector = ^TIdSector;
const
IDE_ID_FUNCTION = $EC;
IDENTIFY_BUFFER_SIZE = 512;
DFP_RECEIVE_DRIVE_DATA = $0007c088;
IOCTL_SCSI_MINIPORT = $0004d008;
IOCTL_SCSI_MINIPORT_IDENTIFY = $001b0501;
DataSize = sizeof(TSendCmdInParams)-1+IDENTIFY_BUFFER_SIZE;
BufferSize = SizeOf(SRB_IO_CONTROL)+DataSize;
W9xBufferSize = IDENTIFY_BUFFER_SIZE+16;
var
hDevice : THandle;
cbBytesReturned : DWORD;
pInData : PSendCmdInParams;
pOutData : Pointer; // PSendCmdOutParams
Buffer : Array[0..BufferSize-1] of Byte;
srbControl : TSrbIoControl absolute Buffer;
procedure ChangeByteOrder( var Data; Size : Integer );
var ptr : PChar;
i : Integer;
c : Char;
begin
ptr := @Data;
for i := 0 to (Size shr 1)-1 do
begin
c := ptr^;
ptr^ := (ptr+1)^;
(ptr+1)^ := c;
Inc(ptr,2);
end;
end;
begin
Result := '';
FillChar(Buffer,BufferSize,#0);
if Win32Platform=VER_PLATFORM_WIN32_NT then
begin // Windows NT, Windows 2000
// Get SCSI port handle
hDevice := CreateFile( '\\.\Scsi0:',
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil, OPEN_EXISTING, 0, 0 );
if hDevice=INVALID_HANDLE_VALUE then Exit;
try
srbControl.HeaderLength := SizeOf(SRB_IO_CONTROL);
System.Move('SCSIDISK',srbControl.Signature,8& #41;;
srbControl.Timeout := 2;
srbControl.Length := DataSize;
srbControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIFY;
pInData := PSendCmdInParams(PChar(@Buffer)
+SizeOf(SRB_IO_CONTROL));
pOutData := pInData;
with pInData^ do
begin
cBufferSize := IDENTIFY_BUFFER_SIZE;
bDriveNumber := 0;
with irDriveRegs do
begin
bFeaturesReg := 0;
bSectorCountReg := 1;
bSectorNumberReg := 1;
bCylLowReg := 0;
bCylHighReg := 0;
bDriveHeadReg := $A0;
bCommandReg := IDE_ID_FUNCTION;
end;
end;
if not DeviceIoControl( hDevice, IOCTL_SCSI_MINIPORT,
@Buffer, BufferSize, @Buffer, BufferSize,
cbBytesReturned, nil ) then Exit;
finally
CloseHandle(hDevice);
end;
end
else
begin // Windows 95 OSR2, Windows 98
hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil,
CREATE_NEW, 0, 0 );
if hDevice=INVALID_HANDLE_VALUE then Exit;
try
pInData := PSendCmdInParams(@Buffer);
pOutData := @pInData^.bBuffer;
with pInData^ do
begin
cBufferSize := IDENTIFY_BUFFER_SIZE;
bDriveNumber := 0;
with irDriveRegs do
begin
bFeaturesReg := 0;
bSectorCountReg := 1;
bSectorNumberReg := 1;
bCylLowReg := 0;
bCylHighReg := 0;
bDriveHeadReg := $A0;
bCommandReg := IDE_ID_FUNCTION;
end;
end;
if not DeviceIoControl( hDevice, DFP_RECEIVE_DRIVE_DATA,
pInData, SizeOf(TSendCmdInParams)-1, pOutData,
W9xBufferSize, cbBytesReturned, nil ) then Exit;
finally
CloseHandle(hDevice);
end;
end;
with PIdSector(PChar(pOutData)+16)^ do
begin
ChangeByteOrder(sSerialNumber,SizeOf(sSeri alNumber));
SetString(Result,sSerialNumber,SizeOf(sSer ialNumber));
end;
end;
این هم روش استفاده از کد بالا :
var s : String;
rc : DWORD;
begin
s := GetIdeDiskSerialNumber;
if s='' then
begin
rc := GetLastError;
if rc=0 then WriteLn('IDE drive is not support SMART feature')
else WriteLn(SysErrorMessage(rc));
end
else WriteLn('Disk serial number: ''', s,'''');
end.
متاسفانه این کد فقط برروی تعدادی از هارد دیسک ها جواب می دهد
:strange:
پس از دو سال بررسی بلاخره به بازار آمد
متفاوت و هوشمندانه
آدرس سایت این کامپوننت کجاست ؟ ( MMSystem Information)
اصلا همچین کامپوننتی وجود ندارد .MMSystem Information
:strange:
پس از دو سال بررسی بلاخره به بازار آمد
متفاوت و هوشمندانه
http://delphi.cartall.com.pl/Pytania/pyt41.htmنوشته شده توسط Delphi KDE
؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟
حالا چطوری میشه سریال مادربرد را درآورد؟ ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
فکر کنم Touskaمنظورش MiTeC System Information Component باشهآدرس سایت این کامپوننت کجاست ؟ ( MMSystem Information)
که نسخه بدون سورس رو میتونید از ادرس زیر مجانی تهیه کنید
http://www.mitec.cz
اون سورس بالایی ک جواب نداد.
بالاخره این همه نرم افزار که بصورت شماره سریال کار می کند و در سطح ایران پخش است از چی استفاده می کنند ( با همه هاردها هم کار می کنه ؟ )
باید نگاه کنم ولی فکر کنم که اون لیبل را میدهد نه شماره سریال هارد را
کامپوننتی که Delphi KDE زحمت کشیده معرفی کرده (MiTec System Information) از لحاظ کارآیی حرف ندارد و انواع و اقسام شماره سریالها و دیگر اطلاعات مربوط به انواع سخت افزار را قابل دسترسی می کند ، دستش درد نکند :flower: :موفق:
فقط یک مشکل دارد و آن اینکه اگر آن را بر روی فرم قرار دهی در هر بار اجرای برنامه نام شرکت سازنده را اعلام می کند اگر راه حلی برای این مشکل وجود داشته باشد عالی است :sad2:
آخه اون نسخه شرط افزار است و ... . :sorry:
کسی راه حل دیگری ، کامپوننتی ، چیزی راجع به این موضوع ندارد ؟
راستی کتابی که javid معرفی کرده بود به درد خورد ؟
این تاپیک هم در مورد شماره سریال هارد بخث شده اما به نتیجه ای نرسیده :sorry:
http://www.barnamenevis.org/viewtopic.php?t=26942
من نمیدانم که بقیه برنامه نویسان از چه کد یا کامپوننتی استفاده می کنند
سلام
من از این کد استفاده می کنیم٬تا حالا هم درست بوده تا نظر دوستان چی باشه :
(کل یونیت رو کپی کردم می بخشید)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
HddLbl: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
function GetIdeDiskSerialNumber : String;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.GetIdeDiskSerialNumber : String;
type
TSrbIoControl = packed record
HeaderLength : ULONG;
Signature : Array[0..7] of Char;
Timeout : ULONG;
ControlCode : ULONG;
ReturnCode : ULONG;
Length : ULONG;
end;
SRB_IO_CONTROL = TSrbIoControl;
PSrbIoControl = ^TSrbIoControl;
TIDERegs = packed record
bFeaturesReg : Byte; // Used for specifying SMART "commands".
bSectorCountReg : Byte; // IDE sector count register
bSectorNumberReg : Byte; // IDE sector number register
bCylLowReg : Byte; // IDE low order cylinder value
bCylHighReg : Byte; // IDE high order cylinder value
bDriveHeadReg : Byte; // IDE drive/head register
bCommandReg : Byte; // Actual IDE command.
bReserved : Byte; // reserved. Must be zero.
end;
IDEREGS = TIDERegs;
PIDERegs = ^TIDERegs;
TSendCmdInParams = packed record
cBufferSize : DWORD;
irDriveRegs : TIDERegs;
bDriveNumber : Byte;
bReserved : Array[0..2] of Byte;
dwReserved : Array[0..3] of DWORD;
bBuffer : Array[0..0] of Byte;
end;
SENDCMDINPARAMS = TSendCmdInParams;
PSendCmdInParams = ^TSendCmdInParams;
TIdSector = packed record
wGenConfig : Word;
wNumCyls : Word;
wReserved : Word;
wNumHeads : Word;
wBytesPerTrack : Word;
wBytesPerSector : Word;
wSectorsPerTrack : Word;
wVendorUnique : Array[0..2] of Word;
sSerialNumber : Array[0..19] of Char;
wBufferType : Word;
wBufferSize : Word;
wECCSize : Word;
sFirmwareRev : Array[0..7] of Char;
sModelNumber : Array[0..39] of Char;
wMoreVendorUnique : Word;
wDoubleWordIO : Word;
wCapabilities : Word;
wReserved1 : Word;
wPIOTiming : Word;
wDMATiming : Word;
wBS : Word;
wNumCurrentCyls : Word;
wNumCurrentHeads : Word;
wNumCurrentSectorsPerTrack : Word;
ulCurrentSectorCapacity : ULONG;
wMultSectorStuff : Word;
ulTotalAddressableSectors : ULONG;
wSingleWordDMA : Word;
wMultiWordDMA : Word;
bReserved : Array[0..127] of Byte;
end;
PIdSector = ^TIdSector;
const
IDE_ID_FUNCTION = $EC;
IDENTIFY_BUFFER_SIZE = 512;
DFP_RECEIVE_DRIVE_DATA = $0007c088;
IOCTL_SCSI_MINIPORT = $0004d008;
IOCTL_SCSI_MINIPORT_IDENTIFY = $001b0501;
DataSize = sizeof(TSendCmdInParams)-1+IDENTIFY_BUFFER_SIZE;
BufferSize = SizeOf(SRB_IO_CONTROL)+DataSize;
W9xBufferSize = IDENTIFY_BUFFER_SIZE+16;
var
hDevice : THandle;
cbBytesReturned : DWORD;
pInData : PSendCmdInParams;
pOutData : Pointer; // PSendCmdOutParams
Buffer : Array[0..BufferSize-1] of Byte;
srbControl : TSrbIoControl absolute Buffer;
procedure ChangeByteOrder( var Data; Size : Integer );
var ptr : PChar;
i : Integer;
c : Char;
begin
ptr := @Data;
for i := 0 to (Size shr 1)-1 do
begin
c := ptr^;
ptr^ := (ptr+1)^;
(ptr+1)^ := c;
Inc(ptr,2);
end;
end;
begin
Result := '';
FillChar(Buffer,BufferSize,#0);
if Win32Platform=VER_PLATFORM_WIN32_NT then
begin // Windows NT, Windows 2000, Windows XP
// Get SCSI port handle
hDevice := CreateFile('\\.\Scsi0:',
// Note: '\\.\C:' required administrative privileges.
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
if hDevice=INVALID_HANDLE_VALUE then Exit;
try
srbControl.HeaderLength := SizeOf(SRB_IO_CONTROL);
System.Move('SCSIDISK',srbControl.Signature,8& #41;;
srbControl.Timeout := 2;
srbControl.Length := DataSize;
srbControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIFY;
pInData := PSendCmdInParams(PChar(@Buffer)
+SizeOf(SRB_IO_CONTROL));
pOutData := pInData;
with pInData^ do
begin
cBufferSize := IDENTIFY_BUFFER_SIZE;
bDriveNumber := 0;
with irDriveRegs do
begin
bFeaturesReg := 0;
bSectorCountReg := 1;
bSectorNumberReg := 1;
bCylLowReg := 0;
bCylHighReg := 0;
bDriveHeadReg := $A0;
bCommandReg := IDE_ID_FUNCTION;
end;
end;
if not DeviceIoControl( hDevice, IOCTL_SCSI_MINIPORT,
@Buffer, BufferSize, @Buffer, BufferSize,
cbBytesReturned, nil ) then
Exit;
finally
CloseHandle(hDevice);
end;
end
else
begin // Windows 95 OSR2, Windows 98, Windows ME
hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0 );
if hDevice=INVALID_HANDLE_VALUE then
Exit;
try
pInData := PSendCmdInParams(@Buffer);
pOutData := @pInData^.bBuffer;
with pInData^ do
begin
cBufferSize := IDENTIFY_BUFFER_SIZE;
bDriveNumber := 0;
with irDriveRegs do
begin
bFeaturesReg := 0;
bSectorCountReg := 1;
bSectorNumberReg := 1;
bCylLowReg := 0;
bCylHighReg := 0;
bDriveHeadReg := $A0;
bCommandReg := IDE_ID_FUNCTION;
end;
end;
if not DeviceIoControl( hDevice, DFP_RECEIVE_DRIVE_DATA,
pInData, SizeOf(TSendCmdInParams)-1, pOutData,
W9xBufferSize, cbBytesReturned, nil ) then
Exit;
finally
CloseHandle(hDevice);
end;
end;
with PIdSector(PChar(pOutData)+16)^ do
begin
ChangeByteOrder(sSerialNumber,SizeOf(sSeri alNumber));
SetString(Result,sSerialNumber,SizeOf(sSer ialNumber));
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.FormShow(Sender: TObject);
var
s : String;
rc : DWORD;
begin
s := GetIdeDiskSerialNumber;
if s='' then
begin
rc := GetLastError;
if rc=0 then
HddLbl.Caption := 'IDE drive does not support SMART feature'
else
HddLbl.Caption := SysErrorMessage(rc);
end
else
HddLbl.Caption := s;
end;
end.
این همان کدی است که در صفحه یک همین تاپیک موجود است و من که تست می کنم پیغام خطای زیر را میدهد :
The system cannot find the file specified
سلام
انگار درسته همون کده٬میبخشید. :embr:
شما که تعریف می کردی حالا بگو چرا روی هارد من کار نمی کنه
کسی دیگر تابع یا کامپوننت جالب (رایگان) قابل ارایه نداره
یه سری به swissdelphi بزن .کسی دیگر تابع یا کامپوننت جالب (رایگان) قابل ارایه نداره
دوست عزیز ظاهرا شما هم بدنبال چنین کامپوننتی بودید (8 خردادMachineID Library SDK ) آیا این را جدیدا پیدا کردید یا نه ؟
http://www.barnamenevis.org/viewtopic.php?t=26942
میشه یه شمه ای از کارایی آنرا بگویید یا سایت آن ؟
دوست من ؛ دنیای دلفی ؛ چی شد ؟ جوابی ندادی :wise1:
این کامپوننت یک شماره سریال منحصربفرد از ترکیب شماره سریال واقعی HDD و BIOS مادربورد می دهد .
به علاوه امکانات بسیار بالاتر
:موفق:
یک سرچ تو google بزن نام سایتوشو پیدا کن و نسخه Trial اون رو دانلود کن .
اگه MiTeC System Information Component Suite version 9.1.0 را داشته باشی خیلی بهتره چون این امکان هست که فقط شماره سریال هارد را بدست بیاری و خیلی امکانات دیگه ؟
Mahdi_S_T نظرت در مودر اینکه چند نفر جمع شویم و نسخه اصلی MiTec System Information را بخریم چیه قیمتش 110 یورو است و سورس آن نیز همراهش است :wink:
من هستم :flower:
پس از دو سال بررسی بلاخره به بازار آمد
متفاوت و هوشمندانه
دوستان این رو من امتحان کردم. رو 3 تا کامپیوتر به درستی جواب داد بدون هیچ مشکلی.با این کد می تونید برنامه رجیستری بسازید. خلاصه 1 کدی میده
function GetHardSerial:integer;
var
SerialNum: DWord;
A,B: DWord;
C: array [0..255] of Char;
Buffer: array [0..255] of Char;
begin
if GetVolumeInformation(
PChar('C:\'),
Buffer,
256,
@SerialNum,
A,
B,
C,
256) then Result:=SerialNum;
end;
دوست عزیز این کد شماره سریال یک درایو را بر می گرداند و با فرمت درایو تغییر می کند .
:strange:
پس از دو سال بررسی بلاخره به بازار آمد
متفاوت و هوشمندانه
اگه جناب کرامتی این تابع رو بنویسه خیلی ها اینو لازم دارند و میشه به قیمت مناسب عرضه بشه :kaf:
اما به شرطی که روی همه هاردها کار کنه ؟ ( جایی که همکار سایت بتونه اینکارو بکنه برای چی کامپوننت خارجی بخریم )
جناب کرامتی - لطفا نظرتان را بدهید
<span dir=ltr>
</span>
- THDDInfo - nonvisual Delphi component provided low level information about IDE, SCSI and ATAPI devices.
Supports both Win9x (IDE and ATAPI only) and WinNT platforms, on WinNT also provided information about SCSI devices.
Provided information:
drive type
Model sting
Firmware revision
Serial number
For IDE also:
drive geometry (cylinders, heads, sectors per track)
LBA sectors count
drive size (nonformatted)
Controller buffer size
رایگان و سورس آزاد
http://artsoft.nm.ru/download/hddinfo.zip
UNIX is simple. It just takes a genius to understand its simplicity
-- Dennis Ritchie
:flower:
پس از دو سال بررسی بلاخره به بازار آمد
متفاوت و هوشمندانه
Inprise
خیلی دمت گرم ، خیلی مرسی :flower: :موفق:
این componenet واقعا جالب و به درد بخور بود ولی اگه کسی کامپوننتی برای سریال main board و ... هم سراغ داشته باشه ممنون می شم که معرفی کنه :embr: