在Delphi中如何取得主板序列号?高分酬谢

liyanjun001 2003-07-18 02:21:42
OS win2k下读主板序列号String(Pchar(Ptr($FEC71)))出错,主板的地址是多少?谢谢
...全文
436 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fairychild 2003-10-05
  • 打赏
  • 举报
回复
好高深的学问呀,不过好像有现成的构件呀
ahjoe 2003-10-05
  • 打赏
  • 举报
回复
我知道多数硬盘,网卡有硬编号。主板也有吗?
Ewyw 2003-10-04
  • 打赏
  • 举报
回复
在2000下不能读主板序列号,但我们可以先判断当前操作系统的版本啊,可是我就是不知道用Delphi7怎么样才能实现在2000下读主板序列号呢,
SStallMan 2003-07-21
  • 打赏
  • 举报
回复
可以采用控件,有的下的,自己找一找把
Eastunfail 2003-07-21
  • 打赏
  • 举报
回复
自己试试
获取主板的工业序列号完全可以实现,注意是硬盘外壳上的序列号,不是格式化后的序列
号,C语言源程序如下(注:该程序由顶尖高手丁凯所写):
#include <windows.h>
#include <stdio.h>

WORD pw[256];

static DWORD idt, int_idt;
static DWORD Base;
static WORD Entry;

#pragma warning (disable:4035)
static int inp(WORD rdx)
{
_asm xor eax, eax
_asm mov dx, rdx
_asm in al, dx
}

static WORD inpw(WORD rdx)
{
_asm xor eax, eax
_asm mov dx, rdx
_asm in ax, dx
}

static void outp(WORD rdx, int ral)
{
_asm mov dx, rdx
_asm mov eax, ral
_asm out dx, al
}

static int WaitIde()
{
int al;

while ((al=inp(0x1F7))>=0x80) ;
return al;
}

static void ReadIDE()
{
int al;
int i;

WaitIde();
outp(0x1F6,0xA0);
al = WaitIde();
if ((al&0x50)!=0x50) return;

outp(0x1F6,0xA0);
outp(0x1F7,0xEC);
al = WaitIde();
if ((al&0x58)!=0x58) return;

for (i=0;i<256;i++) {
pw[i] = inpw(0x1F0);
}
}

static void __declspec( naked ) NowInRing0()
{
_asm {
push ebp
mov ebp,esp

call ReadIDE

cli
mov ebx, int_idt
mov ax, Entry
mov word ptr [ebx-4], ax
mov eax, Base
shr eax, 16
mov [ebx+2], ax
sti
leave
iretd
}
}

void GetIDEInfo()
{
DWORD dwExcept;

dwExcept = (DWORD)NowInRing0;

_asm {
mov eax, fs:[0]
push eax
sidt [esp-02h]
pop ebx
mov idt, ebx
add ebx, 0x1C
mov int_idt, ebx

mov eax, [ebx]
mov [Base], eax
mov ax, [ebx-4]
mov [Entry], ax

cli
mov esi, dwExcept
push esi
mov [ebx-4], si
shr esi, 16
mov [ebx+2], si
pop esi
sti

int 3
}
}

main()
{
char s[80];
register i,j;

GetIDEInfo();

for (i=0,j=0;i<10;i++) {
s[j++]=pw[10+i]>>8;
s[j++]=pw[10+i]&0xFF;
}
s[j] = 0;

printf("Serial=%s\n", s);

return 0;
cowboy2006 2003-07-19
  • 打赏
  • 举报
回复
在Delphi中编制软件版权保护控件


一、概述
  软件作为一种人类智力劳动成果的一种表现形式,融会了设计者和开发者辛勤的劳动和汗水,然而,由于用户观念上的差异和盗版软件的泛滥,软件开发者的权益往往得不到有效的保护,因此,作为必要的手段-----软件的自身保护也就在特定的环境下被重视起来。
  然而,正所谓,"魔高一尺,道高一丈",保护和破解的矛盾关系在始终持续着,要想找到一种万能的保护方法,却也不是那么简单的事。但是,如果开发者使用的保护手段连一般用户都能破解的话(如:修改系统日期),这样的保护则显然达不到保护软件版权的目的。
  基于此,笔者利用Delphi5.0面向对象的特性,设计开发了一个实用的版权保护控件,以为程序开发者提供一种简易的软件保护手段。
二、实现方法
1.在Delphi5.0中新建一个单元文件,书写代码如下,保存:
unit RegObj;

interface

uses
Windows, Messages, SysUtils, Classes, Forms;

type
TRegObj = class
private
FSerial: string; //主板序列号
FKey: string; //密码
FMaxTimes: Integer; //最大运行次数
FCompany: string; //公司名称
FEmail: string; //联系用的电子邮件
protected
procedure SetSerial; //取得主扳的序列号
procedure GetKey; //从用户序列号文件中读取序列号
function GetTimes: Integer; //从文件中读取程序的运行次数
function CheckKey: Boolean; //检查序列号和密码是否匹配的函数
public
constructor Create;
function Execute: Boolean; //运行对象方法
published
property Company: string read FCompany write FCompany;
property MaxTimes: Integer read FMaxTimes write FMaxTimes;
property Email: string read FEmail write FEmail;
end;

implementation

//TRegObj.
constructor TRegObj.Create;
begin
inherited;
end;

function TRegObj.GetTimes: Integer;
Const
//用于存储运行次数的文件,开发人员可自定义或使用注册表存储运行次数
//起此名字用于迷惑破解者,使用前不要和系统的动态链接库同名
Tmp = 'ispnet.dll';
var
Ch: Char;
Dir: array [0..255] of Char;
Fn: string;
I : Integer;
List: Tstrings;
begin
//取得Windows系统的目录
GetSystemDirectory(@Dir, 255);
For I := 0 to 255 do
begin
if Ord(Dir[I]) = 0 then Break;
Fn := Fn + Dir[I];
end;
Fn := Fn + '\' + Tmp;
try
List := TStringList.Create;
if Not FileExists(Fn) then
Ch := Chr(1)
else
begin
List.LoadFromFile(Fn);
Ch := List.Text[1];
Ch := Chr(Ord(Ch) + 1);
end;
List.Text := Ch;
//存储运行次数
List.SaveToFile(Fn);
Result := Ord(Ch);
finally
List.Free;
end;
end;

procedure TRegObj.SetSerial;
begin
//取得主板的序列号
FSerial := String(Pchar(Ptr($FEC71)));
end;

//取得密码
procedure TRegObj.GetKey;
const
Sn = 'Key.dat';
var
List: TStrings;
Fn, Path: string;
begin
Path := ExtractFilePath(Application.ExeName);
Fn := Path + Sn;
if Not FileExists(Fn) then
begin
FKey := '';
Exit;
end;
try
List := TStringList.Create;
List.LoadFromFile(Fn);
FKey := List.Values['Key'];
finally
List.Free;
end;
end;

function TRegObj.CheckKey: Boolean;
begin
//开发人员根据自己的需要进行修改,在这里是为了简单起见
Result := FKey = FSerial;
end;

function TRegObj.Execute: Boolean;
var
Msg: string;
T: Integer;
begin
T := GetTimes;
GetKey;
SetSerial;
if FKey <> FSerial then
begin
Msg := ' 您这是第' + IntToStr(T) + '次运行此程序(最大次数:' + IntToStr(FMaxTimes) + ')!';
Application.MessageBox(PChar(Msg), '用户信息', Mb_Ok + Mb_IconWarning);
Msg := '欢迎使用' + Company + '的软件,如果您觉得满意的话,请注册或购买正版软件!';
Application.MessageBox(PChar(Msg), '建议', Mb_Ok + Mb_IconInformation);
if T > FMaxTimes then
begin
if Application.MessageBox(' 是否注册?', '注册', Mb_YesNo + Mb_IconQuestion) = Id_Yes then
begin
Msg := '您的注册号是:"' + FSerial + '"' + Chr(13) + Chr(10) +
'请您将以上序列号通过电子邮件寄给以下信箱:' + FEmail;
Application.MessageBox(PChar(Msg), '软件 注册', Mb_Ok + Mb_Iconinformation);
end;
Application.Terminate;
end;
end;
end;

end.
2.控件的使用
在Delphi5.0中新建一个应用程序,在程序的引用单元中加入上述单元的引用,在主窗体的OnCreate事件中编写如下代码:
procedure TForm1.FormCreate(Sender: TObject);
var
AObj: TRegObj;
begin
try
AObj := TRegObj.Create;
AObj.MaxTimes := 30;
AObj.Company := '吉星软件工作室';
AObj.Email := 'test@1112.net';
AObj.Execute;
finally
AObj.Free;
end;
end;
三、结束语
  上述控件通过取得用户计算机的主板序列号作为注册码,通过文件存储程序运行次数和密钥,防止了同样的注册码和密钥在不同的计算机上都可以使用的问题,而且,用户通过简单的日期修改无法使程序继续,基本达到了软件版权保护的目的。


                                      稿件来源: 《计算机世界》
                                     供稿者:杨志国
sixgj 2003-07-19
  • 打赏
  • 举报
回复
号是不同的,但2000下的方法比较复杂。
youcheng1 2003-07-19
  • 打赏
  • 举报
回复
要主板序列号有什么用呀,同一批应该是一个号吧。在2000下不能真接读。
sixgj 2003-07-18
  • 打赏
  • 举报
回复
没错,用String(Pchar(Ptr($FEC71)))只能读98下的号,在win2000以上里就出错。没办法噢。
内容概要:本文针对离网光伏直流微网存在的功率供需失衡问题,提出了一种基于光伏最大功率点跟踪(MPPT)与锂离子储能系统双向削峰填谷协同控制的解决方案,并通过Simulink仿真平台进行了系统建模与验证。研究聚焦于间歇性光伏出力条件下48V直流母线电压的稳定控制,构建了包含光伏阵列、Boost DC-DC变换器、负载、双向DC-DC变换器及锂离子电池在内的完整系统架构。通过整合MPPT算法实现光伏出力的最大化捕获,同时设计储能系统的双向充放电闭环调控策略,在光照充足时储存多余电能,在光照不足或负载高峰时释放电能,从而实现“削峰填谷”,有效平衡系统功率,维持直流母线电压稳定。研究还融合了能量管理策略与电池充放电控制逻辑,提升了微网系统的能量自给率、运行稳定性及对复杂工况的适应能力。; 适合人群:具备电力电子、新能源系统、自动化或电气工程等相关专业背景,从事微电网、分布式能源系统、储能控制、光伏系统集成等方向研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于离网型直流微网能量管理系统的设计与仿真验证;②为光伏-储能协同控制策略的研究与优化提供理论依据和技术参考;③实现直流母线电压的精确稳定控制,提升储能系统利用效率,增强系统在光照波动和负载变化等复杂工况下的可靠性和鲁棒性。; 阅读建议:建议结合提供的Simulink仿真模型进行实践操作,重点关注MPPT算法(如扰动观察法或增量电导法)与储能系统充放电控制逻辑(如基于电压阈值或功率预测的充放电策略)之间的协同机制,深入理解能量管理策略的实现流程,并可通过修改光照强度、负载大小等参数,扩展研究不同运行场景下的系统性能表现。

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧