Harddiskin seri numarasının bulanması

Delphi .net ve .net ile ilgili konuları buraya yazabilirsiniz.
Cevapla
arat51
Üye
Mesajlar: 5
Kayıt: 16 Eyl 2003 08:59

Harddiskin seri numarasının bulanması

Mesaj gönderen arat51 »

Harddiskin seri numarasını bulan delphi .net kodu var mı?
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

.net dll'i

Mesaj gönderen sabanakman »

Bunu .net üzerinde değilde win32'de bulan bir .dll hazırlayıp .net'te bu .dll'i kullanmayı dene.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
memiky
Üye
Mesajlar: 116
Kayıt: 17 Kas 2004 01:52
İletişim:

Mesaj gönderen memiky »

GetVolumeInformation() Fonksiyonu

Hard diskin Volume nosunu öğrenmek istiyorsanız bu fonksiyondan yararlanabilirsiniz. Çok sayıda parametreye sahip olan bu fonksiyon Volume veya seri nosu öğrenilmek istenen sürücünün adını 1. parametre olarak almaktadır. Bu fonksiyonun orijinal ve Delphi’ye uyarlanmış halini aşağıda görebilirsiniz.

BOOL GetVolumeInformation(
LPCTSTR lpRootPathName,
LPTSTR lpVolumeNameBuffer,
DWORD nVolumeNameSize,
LPDWORD lpVolumeSerialNumber,
LPDWORD lpMaximumComponentLength,
LPDWORD lpFileSystemFlags,
LPTSTR lpFileSystemNameBuffer,
DWORD nFileSystemNameSize);

[DllImport('kernel32.dll')]
function GetVolumeInformation(
lpRootPathName : string;
lpVolumeNameBuffer :StringBuilder;
nVolumeNameSize : LongInt;
var lpVolumeSerialNumber: LongInt;
var lpMaximumComponentLength: LongInt;
var lpFileSystemFlags : LongInt;
lpFileSystemNameBuffer : StringBuilder;
nFileSystemNameSize: LongInt) : Integer; external;


Fonksiyonu deklare ettikten sonra forma 2 TextBox ve bir düğme yerleştirip düğmenin Click() metodunu aşağıdaki gibi düzenledim.

procedure TWinForm.Button1_Click(sender: System.Object; e: System.EventArgs);
Var
Str1 : StringBuilder;
Str2 : StringBuilder;
Kapasite1 : LongInt;
Kapasite2 : LongInt;
Yol : String;
Seri : LongInt;
Max : LongInt;
Flags : LongInt;
Sonuc : Integer;
begin
Str1 := StringBuilder.Create(255);
Str2 := StringBuilder.Create(255);
Kapasite1 := Str1.Capacity;
Kapasite2 := Str2.Capacity;
Yol := 'C:\';
Seri:=0;
Max:=0;
Flags:=0;
Sonuc := GetVolumeInformation(Yol, Str1, Kapasite1, Seri, Max, Flags, Str2, Kapasite2);
textBox1.Text := Seri.ToString();
textBox2.Text := Seri.ToString('X');
end;
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Öncelikle Memik hoca hoşgeldin. Uzun zamandır yoktunuz :)

HDD Seri no dan kasıt, volume seri no mu yoksa fabrika seri no su mu :?:

Aşağıdaki başlıklar delphi de nasıl yapıldığı hakkında fikir verecektir :wink:
viewtopic.php?t=617
viewtopic.php?t=1764
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
memiky
Üye
Mesajlar: 116
Kayıt: 17 Kas 2004 01:52
İletişim:

Mesaj gönderen memiky »

Recep hoca merhaba;
Haklısınız uzun süredir siteye uğramaz olmuştum. Bazen de login olmadan dolaşıyordum. İnşallah bundan sonra fazla kaybolmam.
Verdiğim kod ile bulunan volume seri numarasıdır,
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

GetComputerName vs. HDDNo :)

Mesaj gönderen sabanakman »

Yukarıda @memiky hocamızın verdiği kodla harddik seri numarası okunuyor. Bildiğim kadarıyla bu kod her disk biçimlendirmesinde değişiyor. Hatta bunu değiştiren programlar bile varmış. HDD fabrika nosunu bulan kodu kullanmam gerekti ve orada da bunu okuyan kodu .net ortamında yazmayı becerememiştim ama onun yerine bu değeri win32'de okuyan dll'i oluşturup .net'ten okumuştum. Mesela bilgisayar adını okuyan GetComputerName benzeri bir dll fonksiyonu oluşturmuştum. Bilindiği gibi GetComputerName'i kullanabilmek için aşağıdaki kodlar kullanılır.

Kod: Tümünü seç

{Windows'ta tanımlı şekli
[SuppressUnmanagedCodeSecurity, DllImport(kernel32, CharSet = CharSet.Auto, SetLastError = True, EntryPoint = 'GetComputerName')]
function GetComputerName(lpBuffer: StringBuilder; var nSize: DWORD): BOOL;external;}

function BilgisayarAdi: string;
var
  LocalMachine: StringBuilder;//System.Text.StringBuilder
  Size: DWORD;                           
begin
  Size := MAX_COMPUTERNAME_LENGTH;
  LocalMachine := StringBuilder.Create(Size);
  if GetComputerName(LocalMachine, Size) then
   Result := LocalMachine.ToString
  else Result := '';
end;
şimdi aynı GetComputerName gibi çalışan kendi win32 dll fonksiyonumuzu yazalım. @rsimsek hocamızın verdiği kısayollar harddisk fabrika numarasını okuyan kodu verdiği için burada tekrar yazmıyorum. Sonuçta oluşan string değeri GetComputerName gibi dll üzerinden aktaracak fonksiyonu aşağıda belirtiyorum. Bu şekilde string değer aktarmaları yapan dll kodu aslında diğer paltformlardan da kullanılabilir. Mesela Visual Basic'ten de bu dll kullanılarak string değer aktarması yapılabilir. Çünkü yapısal mantık olarak GetComputerName ile aynıdır.

Kod: Tümünü seç

function HDDNo(HDDSeriNo:PChar;var Boyu:DWord):Integer;stdcall;
var S:String; i:Integer;
begin
  try
    Result:=0;  
    S:='STRİNG DEĞER';{<--<<--<--<<--harddisk seri nosu bu string değişkene aktarılmalıdır}
    //S:=GetIdeSerialNumber();
    i:=Length(S);
    if Boyu>i then Boyu:=i+1 else S:=Copy(S,1,i-1);{boyut ayarlaması}
    StrCopy(HDDSeriNo,PChar(S));
    Result:=1;
  except
    Result:=-1;
  end;
end;
win32'de yazılan bu HDDNo isimli dll fonksiyonunu tıpkı GetComputerName fonksiyonu gibi kullanabilir.

Kod: Tümünü seç

{[SuppressUnmanagedCodeSecurity, DllImport('KodOku.dll', CharSet = CharSet.Auto, SetLastError = True, EntryPoint = 'HDDNo')]
function HDDNo(HDDSeriNo:StringBuilder;var Boyu:DWord):Integer;external;}

function HDDSeriNo: string;
var
  SeriNo: StringBuilder;
  Size: DWORD;                           
begin
  Size := 50;
  SeriNo := StringBuilder.Create(Size);
  if HDDNo(SeriNo, Size)=1 then
   Result := SeriNo.ToString
  else Result := '';
end;
kolay gelsin.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
Trial_Cooder
Üye
Mesajlar: 236
Kayıt: 17 Nis 2006 04:44

Mesaj gönderen Trial_Cooder »

Delphi Kodlarını İstiyorsan:

Kod: Tümünü seç

function GetDiskSerialNumber(DriveName: Char): DWord;
var
Temp: DWord;
begin
GetVolumeInformation(
PChar(DriveName + ':\' ), Nil, 0, @Result,Temp,Temp,
Nil, 0);
end;
// DriveName: A, B, C, D, ...

Kulanım : GetDiskSerialNumber('C')

Hazır Programını İstiyorsan:
http://www.programlama.com/Main/delphi/ ... /hddsn.zip


Selametle, Hayırlı Ramazanlar :arrow:
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

.net uyuşmazlığı

Mesaj gönderen sabanakman »

Herkese kolay gelsin.

@Trial_Cooder yukarıda ki yazışmaları keşke önce okusaydın.
Trial_Cooder yazdı:Delphi Kodlarını İstiyorsan:

Kod: Tümünü seç

function GetDiskSerialNumber(DriveName: Char): DWord;
var
Temp: DWord;
begin
GetVolumeInformation(
PChar(DriveName + ':\' ), Nil, 0, @Result,Temp,Temp,
Nil, 0);
end;
// DriveName: A, B, C, D, ...

Kulanım : GetDiskSerialNumber('C')

Hazır Programını İstiyorsan:
http://www.programlama.com/Main/delphi/ ... /hddsn.zip


Selametle, Hayırlı Ramazanlar :arrow:
Bu kodlar .net te çalışmaz. .net üzerinden çalışan kodu da zaten @memiky hocamız yukarıda vermiş. Ama "Selametle, Hayırlı Ramazanlar" kısmına katılmamak elde değil. Ben bunu kaçırmışım. Herkeze Selametle, Hayırlı Ramazanlar diliyorum. :)
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
Trial_Cooder
Üye
Mesajlar: 236
Kayıt: 17 Nis 2006 04:44

Mesaj gönderen Trial_Cooder »

Haaaaaaa :P
Ben Delphi 7'de Kaldım, O Yüzden :D
Cevapla