View Full Version : مشکل این کد چیست؟
khoshblagh
سه شنبه 01 بهمن 1387, 12:11 عصر
procedure TForm1.Button1Click(Sender: TObject);
var
VolumeName,FileSystemName : array [0..MAX_PATH-1] of Char;
VolumeSerialNo : DWord;
MaxComponentLength,FileSystemFlags : Integer;
begin
GetVolumeInformation('C:\',VolumeName,MAX_PATH,@Vo lumeSerialNo,
MaxComponentLength,FileSystemFlags,
FileSystemName,MAX_PATH);
Memo1.Lines.Add('VName = '+VolumeName);
Memo1.Lines.Add('SerialNo = $'+IntToHex(VolumeSerialNo,8));
Memo1.Lines.Add('CompLen = '+IntToStr(MaxComponentLength));
Memo1.Lines.Add('Flags = $'+IntToHex(FileSystemFlags,4));
Memo1.Lines.Add('FSName = '+FileSystemName);
end;
این متعلق به جناب آقای Master Wish میباشد.در هنگام اجرا خطای ذیل نمایش داده میشود.
Types of actual and formal var parameters must be identical
البته در رابطه با متغیرهای ذیل خطای فوق اعلام میگردد.
MaxComponentLength,FileSystemFlags,
با تشکر.
vcldeveloper
سه شنبه 01 بهمن 1387, 16:52 عصر
بررسی کنید که آیا تابع GetVolumeInformation برای پارامترهای MaxComponentLength , و FileSystemFlags از نوع داده Integer استفاده میکنه یا نه. اگر از نوع داده دیگه ایی غیر از Integer استفاده میکنه، شما هم باید نوع داده دو متغیر MaxComponentLength و FileSystemFlags را متناسب با آن تغییر بدید.
mossaferin
سه شنبه 01 بهمن 1387, 17:46 عصر
procedure TForm1.Button1Click(Sender: TObject);
var
VolumeName,FileSystemName : array [0..MAX_PATH-1] of Char;
VolumeSerialNo : DWord;
MaxComponentLength,FileSystemFlags : dword;
begin
GetVolumeInformation('C:\',VolumeName,MAX_PATH,@Vo lumeSerialNo,
MaxComponentLength,FileSystemFlags,
FileSystemName,MAX_PATH);
Memo1.Lines.Add('VName = '+VolumeName);
Memo1.Lines.Add('SerialNo = $'+IntToHex(VolumeSerialNo,8));
Memo1.Lines.Add('CompLen = '+IntToStr(MaxComponentLength));
Memo1.Lines.Add('Flags = $'+IntToHex(FileSystemFlags,4));
Memo1.Lines.Add('FSName = '+FileSystemName);
end;
مقدار متغییر از integer به dword تغییر میکنه
موفق باشی
khoshblagh
چهارشنبه 02 بهمن 1387, 07:47 صبح
با تشکر از آقایان کشاورز و mossaferin
مشکل با توجه به راهنمایهای شما برطرف شد. اما موضوعی که من دنبال آن بودم بدست آوردن شماره سریال
هارد سیستم بود ولی این کد شماره سریال داریو (مثلا C)را نشان میدهد. با چه تغییراتی روی همین کد میتوان شماره سریال هارد را به جای شماره سریال داریو بدست آورد.
متشکرم
mossaferin
چهارشنبه 02 بهمن 1387, 11:42 صبح
http://www.barnamenevis.org/forum/showthread.php?t=86512
بازم هست، سرچ کن
khoshblagh
پنج شنبه 03 بهمن 1387, 09:27 صبح
جناب mossaferin
با سلام
کد مورد نظر با زبان vb میباشد. من نیاز به کد سورس به زبان دلفی میباشم.اگر از این نوع سراغ دارید ممنون میشوم آدرس آنرا قید نمایید. متشکر
mossaferin
پنج شنبه 03 بهمن 1387, 14:48 عصر
function GetIdeSerialNumber : String;
const IDENTIFY_BUFFER_SIZE = 512;
type
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 for future use. Must be zero.
end;
TSendCmdInParams = packed record
// Buffer size in bytes
cBufferSize : DWORD;
// Structure with drive register values.
irDriveRegs : TIDERegs;
// Physical drive number to send command to (0,1,2,3).
bDriveNumber : BYTE;
bReserved : Array[0..2] of Byte;
dwReserved : Array[0..3] of DWORD;
bBuffer : Array[0..0] of Byte; // Input buffer.
end;
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 : DWORD;
wMultSectorStuff : Word;
ulTotalAddressableSectors : DWORD;
wSingleWordDMA : Word;
wMultiWordDMA : Word;
bReserved : Array[0..127] of BYTE;
end;
PIdSector = ^TIdSector;
TDriverStatus = packed record
// Error code from driver, or 0 if no error.
bDriverError : Byte;
// Contents of IDE Error register. Only valid when bDriverError is SMART_IDE_ERROR.
bIDEStatus : Byte;
bReserved : Array[0..1] of Byte;
dwReserved : Array[0..1] of DWORD;
end;
TSendCmdOutParams = packed record
// Size of bBuffer in bytes
cBufferSize : DWORD;
// Driver status structure.
DriverStatus : TDriverStatus;
// Buffer of arbitrary length in which to store the data read from the drive.
bBuffer : Array[0..0] of BYTE;
end;
var hDevice : THandle;
cbBytesReturned : DWORD;
ptr : PChar;
SCIP : TSendCmdInParams;
aIdOutCmd : Array [0..(SizeOf(TSendCmdOutParams)+IDENTIFY_BUFFER_SIZE-1)-1] of Byte;
IdOutCmd : TSendCmdOutParams absolute aIdOutCmd;
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 := ''; // return empty string on error
if SysUtils.Win32Platform=VER_PLATFORM_WIN32_NT then // Windows NT, Windows 2000
begin
// warning! change name for other drives: ex.: second drive '\\.\PhysicalDrive1\'
hDevice := CreateFile( '\\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 );
end
else // Version Windows 95 OSR2, Windows 98
hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0 );
if hDevice=INVALID_HANDLE_VALUE then Exit;
try
FillChar(SCIP,SizeOf(TSendCmdInParams)-1,#0);
FillChar(aIdOutCmd,SizeOf(aIdOutCmd),#0);
cbBytesReturned := 0;
// Set up data structures for IDENTIFY command.
with SCIP do
begin
cBufferSize := IDENTIFY_BUFFER_SIZE;
// bDriveNumber := 0;
with irDriveRegs do
begin
bSectorCountReg := 1;
bSectorNumberReg := 1;
// if Win32Platform=VER_PLATFORM_WIN32_NT then bDriveHeadReg := $A0
// else bDriveHeadReg := $A0 or ((bDriveNum and 1) shl 4);
bDriveHeadReg := $A0;
bCommandReg := $EC;
end;
end;
if not DeviceIoControl( hDevice, $0007c088, @SCIP, SizeOf(TSendCmdInParams)-1,
@aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil ) then Exit;
finally
CloseHandle(hDevice);
end;
with PIdSector(@IdOutCmd.bBuffer)^ do
begin
ChangeByteOrder( sSerialNumber, SizeOf(sSerialNumber) );
(PChar(@sSerialNumber)+SizeOf(sSerialNumber))^ := #0;
Result := PChar(@sSerialNumber);
end;
end;
این هم یه کد توی دلفی برای برگرداندن شماره سریال فیزیکی هارد
khoshblagh
شنبه 05 بهمن 1387, 08:14 صبح
جناب mossaferin
بابت کد ارائه شده متشکرم. مشکل من حل شد..
امید امرایی
شنبه 05 بهمن 1387, 08:28 صبح
این هم یه کد توی دلفی برای برگرداندن شماره سریال فیزیکی هارد
اين كد توي ويستا ، دلفي 2009 و برخي هارد هاي ساتا جواب نمي ده.
آيا شما راه حلي براش پيدا كرديد ؟
mossaferin
شنبه 05 بهمن 1387, 13:58 عصر
اين كد توي ويستا ، دلفي 2009 و برخي هارد هاي ساتا جواب نمي ده.
آيا شما راه حلي براش پيدا كرديد ؟
چون مشغول نوشتن یک قفل نرم افزاری بودم ، با دلفی 7 توی ویستا ،روی تعدادی مادربرد مختلفت ، و هاردهای مختلف تست کردم و جواب گرفتم
نمیدونم مشکل شما چیه؟!
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.