반응형
void __fastcall TForm1::Button1Click(TObject *Sender) {
DWORD SerialNum;
DWORD A,B;
char C[256];
char Buffer[256];
if(GetVolumeInformation("C:\\", Buffer, 256, &SerialNum, A, B, C, 256)) {
Label1->Caption = ntToStr(SerialNum);
}
}
HDD Disk 의 고유한 ID를 얻어내는 APIDWORD SerialNum;
DWORD A,B;
char C[256];
char Buffer[256];
if(GetVolumeInformation("C:\\", Buffer, 256, &SerialNum, A, B, C, 256)) {
Label1->Caption = ntToStr(SerialNum);
}
}
예를 들어 내가 만든 프로그램을 불법복제를 막기위해서
하나의 사용자당 하나의 PC에서만 돌아가게 하고 싶은 경우
초기에 고유 ID를 DB에 넣고, 다음부터 불러올때는 저장된 ID와 실제 하드 ID를 비교하면 될듯...
다른곳에 설치를 하려고 할경우에는 조금 번거롭더라도, 새로운 ID로 업데이트를 해주고,
자동업데이트 등으로 다른곳에는 또 사용할수 없도록 해주면 될듯...
(이러면 최소한 주기적으로 업데이트를 해야하는 문제점이...-_-;;)
대안으로 초기에 아이디를 web에 올리는 방법도 괜찮을듯...
로그인시 하드 아이디와 계정별로 고유 아이디를 비교하는 방법으로...
파워빌더(PowerBuilder) 에서는 아래와 같은 방식을 활용하면 될듯...
//하드디스크의 시리얼번호와 파일시스템을 알아내는 API
Gloval External Function :
Function Long GetVolumeInformation(ref String lpRootPathName, ref String lpVolumeNameBuffer, &
Long nVolumeNameSize, ref Long lpVolumeSerialNumber, &
ref Long lpMaximumComponentLength, ref Long lpFileSystemFlags, &
ref String lpFileSystemNameBuffer, Long nFileSystemNameSize) &
library 'kernel32.dll' Alias for "GetVolumeInformationA"
Script :
String volume_name, file_system_name, drive
Long serial_number, max_component_length, file_system_flags
int pos
volume_name = Space(1024)
file_system_name = Space(1024)
drive = "C:\"
If GetVolumeInformation(drive, volume_name, Len(volume_name), serial_number, &
max_component_length, file_system_flags, &
file_system_name, Len(file_system_name)) = 0 Then
messagebox('확인','하드정보을 읽지 못했습니다.')
return
End If
messagebox("확인", "하드이름 : " + volume_name + &
"~rSerial No : " + string(serial_number) + &
"~r파일시스템 : " + file_system_name + &
"~rMaximum Component Length : " + string(max_component_length))
반응형