让注册表记住VFP应用程序的使用次数

在某个程序中加一段程序,要求能累计程序运行的次数。
请问各位高手,这个程序如何写?
---------------------------------------------------------------
转帖:

让注册表记住VFP应用程序的使用次数

下面的示例程序每运行一次,就将注册表中HKEY_CURRENT_USER\SOFTWARE\LYTAPP子键的TimesForUse名下的值加1,直到运行12次为止:

  • 各主键与一个整数(INTEGER)值相对应,即:

#DEFINE HKEY_CLASSES_ROOT BITSET(0,31) &&-2147483648
#DEFINE HKEY_CURRENT_USER BITSET(0,31)+1 &&-2147483647
#DEFINE HKEY_LOCAL_MACHINE BITSET(0,31)+2 &&-2147483646
#DEFINE HKEY_USER BITSET(0,31)+3 &&-2147483645
#DEFINE HKEY_CURRENT_CONFIG BITSET(0,31)+5 &&-2147483643
#DEFINE HKEY_DYN_DATA BITSET(0,31)+6 &&-2147483642

  • 键值的数据类型:1-字符串,3-二进制,4-整数

#DEFINE REG_SZ 1
#DEFINE REG_BINARY 3
#DEFINE REG_DWORD 4

  • 当以下API函数返回0时,操作成功。

DECLARE INTEGER RegOpenKey IN Win32API INTEGER nHKey, STRING @cSubKey, INTEGER @nResult
DECLARE INTEGER RegCreateKey IN Win32API INTEGER nHKey, STRING @cSubKey, INTEGER @nResult
DECLARE INTEGER RegSetValueEx IN Win32API INTEGER hKey, STRING lpszValueName, INTEGER dwReserved,INTEGER fdwType, STRING lpbData, INTEGER cbData
DECLARE INTEGER RegQueryValueEx IN Win32API INTEGER nHKey, STRING lpszValueName, INTEGER dwReserved,INTEGER @lpdwType,STRING @lpbData, INTEGER @lpcbData

  • DECLARE Integer RegDeleteKey IN Win32API ;

  • Integer nHKey, String @cSubKey

  • DECLARE Integer RegDeleteValue IN Win32API ;

  • Integer nHKey, String cSubKey

  • DECLARE Integer RegCloseKey IN Win32API ;

  • Integer nHKey

cSubKey='Software\lytapp'
nResult=0
IF RegOpenKey(HKEY_CURRENT_USER,@cSubKey,@nResult)#0
RegCreateKey(HKEY_CURRENT_USER,cSubKey,@nResult)
ENDIF

  • 在nresult中存放了指向子键“HKEY_CURRENT_USER\Software\lytapp”的长整数值

lpdwType=0
lpbData=SPACE(256)
lpcbData=LEN(lpbData)
IF RegQueryValueEx(nResult,'TimesForUse',0,@lpdwType,@lpbData,@lpcbData)=0
DO CASE
CASE lpdwType=REG_SZ
lpbData=LEFT(lpbData,lpcbData-1)
IF VAL(lpbData)<12
lpbData=ALLTRIM(STR(VAL(lpbData)+1))
MESSAGEBOX('本程序在未注册之前只能使用12次!'+CHR(13)+' 您现在是第'+ lpbData+'次使用本程序。')
lpbData=lpbData+CHR(0)
cbData=LEN(lpbData)
RegSetValueEx(nResult,'TimesForUse',0,REG_SZ,lpbData,cbData)
ELSE
MESSAGEBOX(" 程序已过期!"+CHR(13)+" 请与作者联系注册事宜。")
ENDIF
CASE lpdwType=REG_BINARY
MESSAGEBOX('该键值为二进制数据。')
CASE lpdwType=REG_DWORD
MESSAGEBOX('该键值为长整数数据,请用 NN=0'+CHR(13)+'for i=1 to 4'+CHR(13)+ 'NN=NN+VAL(SUBSTR(lpbdata,i,1)16^(2i-2)'+CHR(13)+ 'endfor 读取此数值。')
OTHERWISE
MESSAGEBOX('未知数据!')
ENDCASE
ELSE
lpbData='1'
MESSAGEBOX('本程序在未注册之前只能使用12次!'+CHR(13)+' 您现在是第'+lpbData+'次使用本程序。')
lpbData=lpbData+CHR(0)
RegSetValueEx(nResult,'TimesForUse',0,REG_SZ,lpbData,2)
ENDIF

  • 警告:当用户不熟悉注册表时最好不要修改其中的内容,否则,可能造成系统的崩溃。若用户想对注册表修改,建议修改前最好将注册表备份。
Published At
Categories with 数据库类
comments powered by Disqus