- 积分
- 15346
- 明经币
- 个
- 注册时间
- 2002-2-4
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2004-1-16 08:07:00
|
显示全部楼层
[转帖]
許多心理測量軟件在最初發佈的時候往往不為人所知,為了讓大家瞭解和接納,開發上往往會有一些共享測試軟件。一些共享軟件往往提供給使用者的是一個功能不受限制的限時使用版,在試用期內使用者可以無限制的使用軟件的全部功能(只是可能會出現提示使用者註冊的窗口),試用期一過部分(或全部)功能失效,要想繼續使用只能向作者索取註冊碼(或註冊文件)完成對軟件的合法註冊,註冊後的軟件將解除一切使用限制。如果您也開發出一個有價值的作品,是否也希望為自己的軟件增加一個這樣的功能呢?這裡筆者就提供一個實現軟件限時的完整代碼。
軟件啟動後會首先運行本代碼並從註冊表HKEY_LOCAL_MACHINE\Software\MyProgram子鍵下的三個鍵值MyProgram1-3中讀取鍵值數據。其中MyProgram2的值是軟件首次運行日期,MyProgram3的值是軟件當前運行時的日期,MyProgram1的值是軟件的使用標誌:如果軟件在試用期內則其值為字符串sign1;如果軟件試用期滿則其值為字符串sign2,如果軟件已經註冊則其值為字符串sign3。全局變量ZHUCE依據讀取的MyProgram1鍵值而賦值:ZHUCE=-1說明試用期滿,ZHUCE=-2說明軟件已註冊,ZHUCE=其它值為剩餘天數,您的主程序代碼要依據此全局變量ZHUCE的值設計相應的交互響應。
為方便您將代碼嵌入現存的程序代碼中,本示例將全部代碼寫入一個模塊.bas中(模塊名隨意,也可添加到已有模塊中)。注意,代碼中的Private Sub Main()過程為整個程序的啟動入口,您需要在「工程屬性」對話框中將「啟動對像」設置為「Sub Main()」。
'通用模塊
Global ZHUCE As Integer
'說明:全局變量ZHUCE=-1試用期滿,ZHUCE=-2已註冊,ZHUCE=其它值為剩餘天數
Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, ByRef phkResult As Long) As Long
Declare Function RegQueryValueEx Lib "advapi32" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, ByRef lpType As Long, ByVal lpData As String, ByRef lpcbData As Long) As Long
Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long
Private Sub Main()'程序總入口
Dim a As Long, rc(3) As Long, hKey As Long, KeyValType As Long, KeyValSize(3) As Long
Dim c As String, h As String, tmpVal(3) As String
Dim datetime As Integer
datetime = 30'試用期天數
ZHUCE = -1
On Error GoTo cuowu
'以下從註冊表HKEY_LOCAL_MACHINE\Software\MyProgram的三個值中取出相關數據字串tmpVal(3)
a = RegOpenKeyEx(&H80000002, "Software\MyProgram", 0, 131135, hKey) ' 打開註冊表關鍵字
For a = 1 To 3: tmpVal(a) = String$(1024, 0): KeyValSize(a) = 1024: Next
rc(1) = RegQueryValueEx(hKey, "MyProgram3", 0, KeyValType, tmpVal(1), KeyValSize(1))
rc(2) = RegQueryValueEx(hKey, "MyProgram2", 0, KeyValType, tmpVal(2), KeyValSize(2))
rc(3) = RegQueryValueEx(hKey, "MyProgram1", 0, KeyValType, tmpVal(3), KeyValSize(3))
For a = 1 To 3
If (Asc(Mid(tmpVal(a), KeyValSize(a), 1)) = 0) Then
tmpVal(a) = Left(tmpVal(a), KeyValSize(a) - 1)
Else
tmpVal(a) = Left(tmpVal(a), KeyValSize(a))
End If
Next
a = RegCloseKey(hKey) '關閉註冊表
'使用期限判斷
If tmpVal(3) = "sign3" Then ZHUCE = -2: Exit Sub '查找到已註冊標誌sign3
If Len(tmpVal(1)) = 1023 And Len(tmpVal(2)) = 1023 And Len(tmpVal(3)) = 1023 Then
'首次使用,將當前日期分別寫入tmpVal(1)和tmpVal(2)中,在tmpVal(3)中寫入准許運行標誌sign1
CreateObject("WScript.Shell").regWrite "HKEY_LOCAL_MACHINE\Software\MyProgram\MyProgram3", Date$, "REG_SZ"
CreateObject("WScript.Shell").regWrite "HKEY_LOCAL_MACHINE\Software\MyProgram\MyProgram2", Date$, "REG_SZ"
CreateObject("WScript.Shell").regWrite "HKEY_LOCAL_MACHINE\Software\MyProgram\MyProgram1", "sign1", "REG_SZ"
ZHUCE = datetime
MsgBox "試用期剩餘" & Trim(datetime) & "天"
Else
If tmpVal(3) = "sign2" Then '查找到永久中止標誌sign2中止使用
ZHUCE = -1
Exit Sub
MsgBox "試用期已滿,請您註冊!"
End If
If Date < DateValue(tmpVal(2)) Then '人為將系統日期往回更改中止使用
'寫入tmpVal(3)中止使用字串「sign2」
CreateObject("WScript.Shell").regWrite "HKEY_LOCAL_MACHINE\Software\MyProgram\MyProgram1", "sign2", "REG_SZ"
ZHUCE = -1
MsgBox "試用期已滿,請您註冊!"
Else
If DateValue(Date) - DateValue(tmpVal(1)) > datetime Then '使用期超過datetime天中止使用
'寫入tmpVal(3)中止使用字串sign2
CreateObject("WScript.Shell").regWrite "HKEY_LOCAL_MACHINE\Software\MyProgram\MyProgram1", "sign2", "REG_SZ"
ZHUCE = -1
MsgBox "試用期已滿,請您註冊!"
Else
'寫入當前日期於tmpVal(2)中
CreateObject("WScript.Shell").regWrite "HKEY_LOCAL_MACHINE\Software\MyProgram\MyProgram2", Date$, "REG_SZ"
ZHUCE = datetime - (DateValue(Date) - DateValue(tmpVal(1)))
MsgBox "試用期剩餘" & Trim(datetime) & "天"
End If
End If
End If
cuowu:
End Sub
從安全保密角度出發,當您應用上述代碼時紫色部分應該根據您個人的保密設想進行必要的修改(當然您也可以不修改而直接應用):1示例中的代碼把軟件的註冊與運行信息保存在HKEY_LOCAL_MACHINE\Software\MyProgram子鍵下的MyProgram1-3三個鍵值內,請根據您個人的保密原則修改為您所需要的子鍵名,以隱蔽為原則!2MyProgram1鍵值中的數據(字符串sign1或sign2或sign3分別對應著試用/期滿/註冊)應根據您個人的保密設想修改成需要的字符串,也以隱蔽為原則!
主程序中當用戶輸入正確的註冊碼(註冊碼當然是您隨意願而設)後,請執行語句:
CreateObject("WScript.Shell").regWrite "HKEY_LOCAL_MACHINE\Software\MyProgram\MyProgram1", "sign2", "REG_SZ"
完成軟件註冊。(該行代碼中的Software\MyProgram\MyProgram1和sign2請與上述代碼保持一致!)
以上代碼在VB6、Win95/98/NT/Me/2000下調試通過。
以上的方法最怕就是把註冊資料整個刪除,即回到原始未安裝狀態,只好再想辦法,當首次運行除了註冊資料外再加一個參考檔,如meflying版主所說把它看起來不起眼(把檔名改為xxx.tmp / xxx.sys,放在一些看來很重要的目錄裡如c:\winnt\system,通常大家都不敢隨便動它),當兩種檔案都存在時,程序才能運行。
注意: 註冊資料最好編碼處理 |
|