首页
社区
课程
招聘
[求助]PB程序注册算法求助
发表于: 2010-12-17 20:43 6386

[求助]PB程序注册算法求助

2010-12-17 20:43
6386
$PBExportHeader$uo_reg.sru
forward
global type uo_reg from nonvisualobject
end type
end forward

global type uo_reg from nonvisualobject
end type
global uo_reg uo_reg

type prototypes
Function ulong GetModuleFileName(ulong hModule,ref string lpFileName,ulong nSize) LIBRARY "kernel32.dll" ALIAS FOR "GetModuleFileNameA"
Function boolean GetVolumeInformationA(string lpRootPathName,ref string lpVolumeNameBuffer,ulong nVolumeNameSize,ref ulong lpVolumeSerialNumber,ref ulong lpMaximumComponentLength,ref ulong lpFileSystemFlags,ref string lpFileSystemNameBuffer,ulong nFileSystemNameSize) LIBRARY "kernel32.dll"
Function ulong CopyFile(ref string lpExistingFileName,ref string lpNewFileName,ulong bFailIfExists) LIBRARY "kernel32.dll" ALIAS FOR "CopyFileA"
FUNCTION ulong GetSystemDirectory(ref string lpBuffer,ulong nSize) LIBRARY "kernel32.dll" ALIAS FOR "GetSystemDirectoryA"
FUNCTION ulong GetModuleHandle(ref string lpModuleName) LIBRARY "kernel32.dll"
FUNCTION ulong GetModuleUsage(uint ModuleHandle) LIBRARY "kernel32.dll"
end prototypes
type variables
string str_AppPath
end variables

forward prototypes
public subroutine of_database_reg (string str_sources, string db_name, string db_path, boolean reg_fs)
public function string uf_disk_getserialnumber ()
public function string of_reg_code (string str_disk_number)
public subroutine of_app_path ()
public function string of_reg_gs_code (string str_gs)
public function integer of_copy_driver (string str_file, string sys_path)
public function integer of_app_run ()
end prototypes

public subroutine of_database_reg (string str_sources, string db_name, string db_path, boolean reg_fs);//str_source数据源
//db_name数据名
//db_path数据库路径
//reg_fs注册方式,False为正常注册,True为强行注册

Integer Answer,Answer1,Answer2,Answer3,Answer4,Answer5
string ls_start,ls_location,str_Installed,str_mess,str_temp,str_path,str_WOD50T,str_dbl50t,str_wl50ent,str_wtr50t
long ulng_result,l_return

//获取操作系统的SYSTEM目录
//用API
ls_Location = space( 128 )
l_return=GetSystemDirectory(ls_Location, 128 )

if l_return<1 then
        MessageBox("错误!","应用程序无法获取Windows的系统目录,系统将终止运行!",StopSign!)
        halt;
        return;
end if

//访问注册表
//Answer=RegistryGet("HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Setup", "SysDir", RegString!, ls_Location)
//IF Answer = -1 Then
//        MessageBox("错误!","应用程序无法获取Windows的系统目录,系统将终止运行!",StopSign!)
//        Return
//End if

//判断SYBASE SQL ANYWHERE 5.0 的驱动程序是否正确安装
str_WOD50T=ls_Location+"\WOD50T.DLL"
str_dbl50t=ls_Location+"\dbl50t.dll"
str_wl50ent=ls_Location+"\wl50ent.dll"
str_wtr50t=ls_Location+"\wtr50t.dll"
//
ls_Start=str_appdir+"dbeng50.EXE"

IF  not FileExists(ls_Start) Then
        MessageBox("错误!","缺少文件在"+ls_start+",系统将终止运行!",StopSign!)
        halt;
        Return
End IF

ls_Start=ls_Start+" -Q"

//读取Sybase SQL Anywhere 5.0是否已正确安装
Answer=Registryget("HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\ODBC DRIVERS","Sybase SQL Anywhere 5.0", RegString!, str_Installed)

if (answer= -1) or (upper(str_Installed)<>upper("Installed"))then
        IF not FileExists(str_WOD50T)  Then
                //以下要拷贝文件WOD50T.DLL
                str_temp=str_appdir+"WOD50T.DLL"
                if of_copy_driver(str_temp,str_WOD50T)=-1 then
                        return;
                end if
               
        //以下要拷贝文件dbl50t.dll
                str_temp=str_appdir+"dbl50t.dll"
                if of_copy_driver(str_temp,str_dbl50t)=-1 then
                        return;
                end if               
               
        //以下要拷贝文件wl50ent.dll
                str_temp=str_appdir+"wl50ent.dll"
                if of_copy_driver(str_temp,str_wl50ent)=-1 then
                        return;
                end if               
               
        //以下要拷贝文件wtr50t.dll
                str_temp=str_appdir+"wtr50t.dll"
                if of_copy_driver(str_temp,str_wtr50t)=-1 then
                        return;
                end if                               
        End IF

        //设置ODBC\ODBCINST.INI\ODBC DRIVERS
        Answer=RegistrySet("HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\ODBC DRIVERS","Sybase SQL Anywhere 5.0", RegString!, "Installed")
        IF Answer = -1 Then
                MessageBox("错误!","应用程序无法设置ODBC\ODBCINST.INI\ODBC DRIVERS,系统将终止运行!",Information!) //程序中不折行
                halt close
                Return
        End if
        //设置ODBC\ODBCINST.INI\
        Answer1=RegistrySet("HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\Sybase SQL Anywhere 5.0", "CPTimeout", RegString!, "not pooled")
        Answer2=RegistrySet("HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\Sybase SQL Anywhere 5.0", "Driver", RegString!,str_WOD50T)
        Answer3=RegistrySet("HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\Sybase SQL Anywhere 5.0", "Setup", RegString!,str_WOD50T)
        IF Answer1 = -1 OR Answer2 = -1 OR Answer3 = -1 Then
                MessageBox("错误!","应用程序无法设置ODBC\ODBCINST.INI,系统将终止运行!",Information!)//程序中不折行
                halt close
                Return
        End if
end if

//读取要注册的数据源是否已存在
Answer=RegistryGet("HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources", str_Sources, RegString!, str_mess)
if (answer= -1)  or (upper(str_mess)<>upper("Sybase SQL Anywhere 5.0")) or (reg_fs) then       
        //设置数据源名称
        Answer=RegistrySet("HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources", str_Sources, RegString!, "Sybase SQL Anywhere 5.0")
        if answer= -1 then
                MessageBox("错误!","应用程序无法设置ODBC DATA SOURCE名称,系统将终止运行!",Information!) //程序中不折行
                halt close
                Return
        end if

        //设置ODBC.ini细节
        Answer1=RegistrySet("HKEY_current_user\software\odbc\odbc.ini\"+str_sources, "driver", Regstring!, str_WOD50T)
        Answer2=RegistrySet("HKEY_current_user\software\odbc\odbc.ini\"+str_sources, "start", Regstring!, ls_Start)
        Answer3=RegistrySet("HKEY_current_user\software\odbc\odbc.ini\"+str_sources, "autostop", Regstring!, "yes")
        Answer4=RegistrySet("HKEY_current_user\software\odbc\odbc.ini\"+str_sources, "DataBaseFile", Regstring!, db_path)
        Answer5=RegistrySet("HKEY_current_user\software\odbc\odbc.ini\"+str_sources, "DataBaseName", Regstring!, db_name)
        IF Answer1 = -1 OR Answer2 = -1 OR Answer3 = -1 OR Answer4 = -1 OR Answer5 = -1 Then
                MessageBox("错误!","应用程序无法设置ODBC.INI细节,系统将终止运行!",Information!)
                halt close
                Return
        End if                       
else
        Answer1=RegistryGet("HKEY_current_user\software\odbc\odbc.ini\"+str_sources, "DataBaseFile", Regstring!, str_path)
        if answer1= -1 or str_path<>db_path then
                //设置ODBC.ini细节
                Answer1=RegistrySet("HKEY_current_user\software\odbc\odbc.ini\"+str_sources, "driver", Regstring!, str_WOD50T)
                Answer2=RegistrySet("HKEY_current_user\software\odbc\odbc.ini\"+str_sources, "start", Regstring!, ls_Start)
                Answer3=RegistrySet("HKEY_current_user\software\odbc\odbc.ini\"+str_sources, "autostop", Regstring!, "yes")
                Answer4=RegistrySet("HKEY_current_user\software\odbc\odbc.ini\"+str_sources, "DataBaseFile", Regstring!, db_path)
                Answer5=RegistrySet("HKEY_current_user\software\odbc\odbc.ini\"+str_sources, "DataBaseName", Regstring!, db_name)
                IF Answer1 = -1 OR Answer2 = -1 OR Answer3 = -1 OR Answer4 = -1 OR Answer5 = -1 Then
                        MessageBox("错误!","应用程序无法设置ODBC.INI细节,系统将终止运行!",Information!)
                        halt close
                        Return
                End if                       
        end if
end if

end subroutine

public function string uf_disk_getserialnumber ();//获取与一个磁盘卷有关的信息

//返回值
//Long,非零表示成功,零表示失败。会设置GetLastError

//参数表
//参数 类型及说明

//lpRootPathName String,欲获取信息的那个卷的根路径
//lpVolumeNameBuffer String,用于装载卷名(卷标)的一个字串
//nVolumeNameSize Long,lpVolumeNameBuffer字串的长度
//lpVolumeSerialNumber Long,用于装载磁盘卷序列号的变量
//lpMaximumComponentLength Long,指定一个变量,用于装载文件名每一部分的长度。例如,在“c:\component1\component2.ext”的情况下,它就代表component1或component2名称的长度
//lpFileSystemFlags Long,用于装载一个或多个二进制位标志的变量。对这些标志位的解释如下:
//FS_CASE_IS_PRESERVED 文件名的大小写记录于文件系统
//FS_CASE_SENSITIVE 文件名要区分大小写
//FS_UNICODE_STORED_ON_DISK 文件名保存为Unicode格式
//FS_PERSISTANT_ACLS 文件系统支持文件的访问控制列表(ACL)安全机制
//FS_FILE_COMPRESSION 文件系统支持逐文件的进行文件压缩
//FS_VOL_IS_COMPRESSED 整个磁盘卷都是压缩的
//lpFileSystemNameBuffer String,指定一个缓冲区,用于装载文件系统的名称(如FAT,NTFS以及其他)
//nFileSystemNameSize Long,lpFileSystemNameBuffer字串的长度

string ls_VolumeNameBuffer,as_rootpathname
ulong ll_VolumeSerialNumber
ulong ll_MaximumComponentLength
ulong ll_FileSystemFlags
string ls_FileSystemNameBuffer

as_RootPathName="C:\"
ls_VolumeNameBuffer=Space(256)
ls_FileSystemNameBuffer=Space(256)

IF not GetVolumeInformationA(as_RootPathName,ls_VolumeNameBuffer,256,ll_VolumeSerialNumber,ll_MaximumComponentLength,ll_FileSystemFlags,ls_FileSystemNameBuffer,256) THEN
        SetNull(ll_VolumeSerialNumber)
END IF

RETURN String(ll_VolumeSerialNumber)

end function

public function string of_reg_code (string str_disk_number);string str_ch,str_code
integer len_str,i,i_ch[8],j//生成8位注册码

str_code=''

if isnull(str_disk_number) then
        str_disk_number=''
end if

str_disk_number=str_disk_number+'njm2527137'

for i=1 to 8
        i_ch[i]=0
next

i=1
len_str=len(str_disk_number)

do while i<=len_str       
       
        //设8位注册码
        j=mod(i,8)
       
        if j=0 then
                j=8               
        end if
        //除8余累加
       
        str_ch=mid(str_disk_number,i,1)       
        i_ch[j]=i_ch[j]+asc(str_ch)
       
        i++
loop

for i=1 to 8
        i_ch[i]=mod(i_ch[i],155)
        choose case i_ch[i]
                case is>130
                        i_ch[i]=i_ch[i]/2
                case is>90
                        i_ch[i]=i_ch[i]/2 + 25                       
                case is>65
                        i_ch[i]=i_ch[i]
                case is>40
                        i_ch[i]+=25
                case is>15
                        i_ch[i]+=50
                case is>0
                        i_ch[i]+=65
                case else
                        i_ch[i]=65                       
        end choose
       
        str_code=str_code+char(i_ch[i])
next

return str_code;
end function

public subroutine of_app_path ();string str_ch,str_app_gsmc
integer int_ret,l_str,i

//以下是获取应用程序所在的目录
str_AppPath = Space (128)
int_ret = GetModuleFileName (Handle (GetApplication ()), str_Apppath, 128)
l_str=len(str_apppath)

i=l_str
str_ch=''
do while  str_ch<>'\'        
        str_ch=mid(str_apppath,i,1)
        i --
loop
str_appdir=mid(str_apppath,1,i + 1)

end subroutine

public function string of_reg_gs_code (string str_gs);string str_ch,str_code
integer len_str,i,i_ch[10],j//生成10位注册码

str_code=''

if isnull(str_gs) then
        str_gs=''
end if

str_gs=str_gs+'njm2527137'

for i=1 to 10
        i_ch[i]=0
next

i=1
len_str=len(str_gs)

do while i<=len_str       
       
        //设十位注册码
        j=mod(i,10)
       
        if j=0 then
                j=10               
        end if
        //除10余累加
       
        str_ch=mid(str_gs,i,1)       
        i_ch[j]=i_ch[j]+asc(str_ch)
       
        i++
loop

for i=1 to 10
        i_ch[i]=mod(i_ch[i],155)
        choose case i_ch[i]
                case is>130
                        i_ch[i]=i_ch[i]/2
                case is>90
                        i_ch[i]=i_ch[i]/2 + 25                       
                case is>65
                        i_ch[i]=i_ch[i]
                case is>40
                        i_ch[i]+=25
                case is>15
                        i_ch[i]+=50
                case is>0
                        i_ch[i]+=65
                case else
                        i_ch[i]=65                       
        end choose
       
        str_code=str_code+char(i_ch[i])
next

return str_code;
end function

public function integer of_copy_driver (string str_file, string sys_path);long ulng_result
if not FileExists(str_file) then
        messagebox("错误!","缺少文件在"+str_file+",系统将终止运行!",StopSign!)
        MessageBox("错误!","系统中没有安装SYBASE SQL ANYWHERE 的驱动程序,系统将终止运行!",StopSign!)
        halt close
        Return -1
end if
//拷贝文件
ulng_result=CopyFile(str_file, sys_path,0)
if ulng_result=0 then
         messagebox("错误","复制文件出错,请与管理员联系!,退出",stopsign!)
         halt close;
         return -1
end if

return 1;
end function

public function integer of_app_run ();//判断应程序的运行次数

return 1;
end function

on uo_reg.create
TriggerEvent( this, "constructor" )
end on

on uo_reg.destroy
TriggerEvent( this, "destructor" )
end on

希望能得到算法步骤讲解或注册机

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 231
活跃值: (40)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
2
看的头疼~~~~~~~~~~
2011-9-8 09:45
0
雪    币: 517
活跃值: (35)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
这都看不懂,来这里玩啥?


用VB简化了一下,将计算8位和10位的关键函数合并并优化了下,自己看吧:

Private Function of_reg_code(str_disk_number As String, regcode_len As Integer) As String
    Dim str_ch As String, str_code As String
    Dim len_str As Integer, i As Integer, i_ch() As Integer, j As Integer '生成指定长度注册码
    
    ReDim i_ch(regcode_len)
    
    str_disk_number = str_disk_number + "njm2527137"
      
    j = 1
    len_str = Len(str_disk_number)
    
    For i = 1 To len_str
        '依序累加到对应单元
        str_ch = Mid(str_disk_number, i, 1)
        i_ch(j) = i_ch(j) + Asc(str_ch)
        j = j + 1
        If j > 8 Then j = 1
    Loop
    
    For i = 1 To regcode_len
        i_ch(i) = i_ch(i) Mod 155
        Select Case i_ch(i) '转化到大写字符范围
            Case Is > 130: i_ch(i) = i_ch(i) / 2
            Case Is > 90:  i_ch(i) = i_ch(i) / 2 + 25
            Case Is > 65:  i_ch(i) = i_ch(i)
            Case Is > 40:  i_ch(i) = i_ch(i) + 25
            Case Is > 15:  i_ch(i) = i_ch(i) + 50
            Case Is > 0:   i_ch(i) = i_ch(i) + 65
            Case Else:     i_ch(i) = 65
        End Select
        str_code = str_code + Char(i_ch(i))
    Next
    
    of_reg_code = str_code
End Function
2011-9-8 14:05
0
雪    币: 411
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
pb的程序?怎么得到的代码?
2011-9-10 05:16
0
游客
登录 | 注册 方可回帖
返回
//