您现在的位置: 中国男护士网 >> 考试频道 >> 计算机等级 >> 二级辅导 >> VFP >> 辅导 >> 正文    
  让注册表记住VFP应用程序的使用次数 【注册男护士专用博客】          

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

www.nanhushi.com     佚名   不详 

  注册表是Windows操作系统中保存系统的硬件信息、应用程序信息和用户信息的一个数据库,它为应用程序提供了保存参数设置的最佳场所。 在Windows操作系统中,当我们运行“RegEdit.exe”文件,从打开的注册表编辑窗口中可以看出,注册表由左右两个部分组成: 左侧各项目的第一层称为注册表的主键,双击各主键时延伸出的各键称之为子键;窗口的右侧是各子键的键值,每一个子键都有其相应的默认值和用不同的键值名表示的键值(其中默认值的键值名为一空串)。

  在VFP应用程序中读写注册表数据需借助WIN32API(即Windows 32位应用程序接口)函数,为了像使用其它VFP函数一样调用WIN32API函数,必须先用DECLARE命令对每一个被调用函数进行注册(声明),其格式为DECLARE [cFunctionType] FunctionName IN LibraryName [AS AliasName] ;

  [cParamType1 [@] ParamName1,cParamType2 [@] ParamName2, ...]

  其中各参数的意义为:①cFunctionType为函数的返回值类型,可是SHORT、INTEGER或LONG、SINGLE、DOUBLE、STRING之一,如果函数没有返回值,则省略cFunctionType;②FunctionName指出被调用WIN32API函数名,请注意大小写,否则VFP将在.DLL库(LibraryName)中搜索不到该函数而出错, 如果该函数名与VFP的函数同名,可用AS子句另取一个合法的VFP函数名;③LibraryName指定外部Windows .DLL的名称,如取WIN32API,则VFP就在KERNEL32.DLL, GDI32.DLL, USER32.DLL, MPR.DLL和ADVAPI32.DLL中搜索FunctionName;④cParamType指定各参数的类型,可为INTEGER或LONG、SINGLE、DOUBLE、STRING之一,在VFP中向函数传递参数的方式有两种:按值传递和按名(引用)传递,前者只把变量(也可为常数)的值传给函数,因而在函数内部不能修改该变量的值;后者是把变量(不能用常数)的地址传给函数,因而在函数内部可修改该变量的值,适用于需要在函数内部修改该变量的值或在变量中放置返回值的情况。VFP中如在变量名前加“@”表示按引用传递参数,不加“@”表示按值传递参数。至于本示例程序中各参数是按引用传递还是按值传递,从DECLARE命令和函数调用语句中一看便知。
  下面的示例程序每运行一次,就将注册表中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^(2*i-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

  * 警告:当用户不熟悉注册表时最好不要修改其中的内容,否则,可能造成系统的崩溃。若用户想对注册表修改,建议修改前最好将注册表备份。

 

文章录入:杜斌    责任编辑:杜斌 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     

    联 系 信 息
    QQ:88236621
    电话:15853773350
    E-Mail:malenurse@163.com
    免费发布招聘信息
    做中国最专业男护士门户网站
    最 新 热 门
    最 新 推 荐
    相 关 文 章
    没有相关文章
    专 题 栏 目

      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)                            【进男护士社区逛逛】
    姓 名:
    * 游客填写  ·注册用户 ·忘记密码
    主 页:

    评 分:
    1分 2分 3分 4分 5分
    评论内容:
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。