Mini Kabibi Habibi

Current Path : C:/Users/ITO/Desktop/VF9/program files/microsoft visual foxpro 9/
Upload File :
Current File : C:/Users/ITO/Desktop/VF9/program files/microsoft visual foxpro 9/vfpclean.app

�� �~�`_%"�$�'\%fr�1�L���T��C�vfpclean�N��%�C����O��8�B��
��C����ULOAPP
STARTCLEAN�%�C��
���B��
��C����
��C����
��C����
��C����
��C����
��C����
��C������C��]��U	THISCHECKSTARTUPCLEANFOXREGCLEANSAMPLESCLEANFOXCODECLEANFOXTASK
CLEANFOXXTRAS	CLEANCHMSCLEANAPPKEYA�����
T�����#T��C�_STARTUP������!T���C�VFPCLEAN�����%���
��&�WT��C�zThe VFPClean utility will check and repair invalid Visual FoxPro options registry keys and certain critical product files.C�
 C�
 C�
 C�
 �{If you are running VFPClean just after installing Visual FoxPro, select <Yes>. This silent option is typically used if you �Yhad a previous Beta version on your machine and want to restore to a clean install state.C�
 C�
 C�
 C�
 �Select <No> if you want to run VFPClean in normal interactive mode to detect invalid registry keys and critical product files. �7See the Visual FoxPro readme.htm file for more details.�#�x��
H���"��������T���a��������T���-��2�"�B�-����T�����
��U
LCOPTIONVALUELNMBLNERRTHISOFOXREGGETFOXOPTIONLSTARTUPLDISPLAYLOG�,��C�	_BEAUTIFYC�Q�BEAUTIFY.APP����*��C�_BROWSERC�Q�BROWSER.APP����*��C�_BUILDERC�Q�BUILDER.APP����,��C�
_CODESENSEC�Q�FOXCODE.APP����,��C�
_CONVERTERC�Q�CONVERT.APP����,��C�	_COVERAGEC�Q�COVERAGE.APP����*��C�_GALLERYC�Q�GALLERY.APP����*��C�_GENHTMLC�Q�GENHTML.PRG����*��C�_GENMENUC�Q�GENMENU.PRG����*��C�_GENXTABC�Q�VFPXTAB.PRG����6��C�_OBJECTBROWSERC�Q�OBJECTBROWSER.APP����*��C�_SCCTEXTC�Q�SCCTEXT.PRG����,��C�	_TASKLISTC�Q�TASKLIST.APP����(��C�_WIZARDC�Q�
WIZARD.APP����*��C�_TOOLBOXC�Q�TOOLBOX.APP����(��C�_FOXREFC�Q�
FOXREF.APP����+��C�HelpToC�Q�DV_FOXHELP.CHM����UTHISCHECKFOXREG���
T�����#T��C�_SAMPLES������%�C�������U�B��%�C��=�"���T��C����$%�CC���fCC�Q�Samples\f����B��%T���"CC�Q�Samples\f�"����C�_SAMPLES������C�_SAMPLES������U
LCOPTIONVALUELNERRTHISOFOXREGGETFOXOPTION	UPDATELOGSETFOXOPTIONP���������
T�����
T�����
T�����%�C����C�C����c�B��T��C�������%�C���������B��%�C��=�"����T��C���� %�C�
�0�C�fC�f	����B��%�C�
�0
�C�0	���B��%�C�
�0
���%���	
������CٴIt appears that critical files (e.g., Wizards) are missing from your Visual FoxPro installation. It is recommended that you rereun the Visual FoxPro setup to reinstall these files.�x��T��	�a���B��%���

���
H�5���C�0
��E��CC���fCC���f����%���
����%�C��You have references to critical files (e.g., Wizards) which appear to be those of an older version of Visual FoxPro.  Would you like to change your references to use files from the current version (Yes) or keep using the older ones (No)?�$�x�����T���a���T���a���%�������B��2��%���

����
%�C�You have references to critical files (e.g., Wizards) which are not the default ones (you may have overridden the default setting with your own custom version). Would you like to keep your current settings (Yes) or reset to the default ones (No)?�$�x�����T���a���T��
�a���%������B������C�����!��C��"��"�����UTCREGKEY
TCDEFAULTFILE
LCOPTIONVALUELCOPTIONNAME
LCDEFAULTFILELNERRTHISOFOXREGGETFOXOPTIONLSHOWMSGBOXLSTARTUPLSKIPOLDFILESMSGBOX
LSKIPOLDFILESLSKIPNONDEFFILESMSGBOXLSKIPNONDEFFILES	UPDATELOGSETFOXOPTION���������
T�����T��CC�����C�����+�a����T������ T����_C�_�.DBF��%�C�0
����!���	B����U
TCFILENAMELNFILECOUNT
LCBACKFILE
LCFILENAMEP���T���N��%�C���C�N0
��I���C�_FOXTASK�������U
LCFILENAMETHISOFOXREGSETFOXOPTIONG��������T���M��%�C���C�M0
������C�_FOXCODE������t��C�dYour foxcode table (_FOXCODE) could not be found. Please run the IntelliSense Manager to restore it.��	��B��T��C�QC�����%�C�0
�C�fC�f���B���%���

�CٌWould you like to replace your foxcode table (_FOXCODE) with a clean copy from your home directory (a backup of your original will be made)?�$�x�	����B��T���C���%�C�Q������T���Q����%�C�L�����/�T���L����T�C�����T��C�����Q�����%�CC�
��1�(����Q������C��FPT����Q�����%�CC�
����(����Q��a��C�QThe foxcode table (_FOXCODE) was backed up and replaced in the original location.��	���T�C�����U

LCFILENAMELCBACKUPFILE
LCEDITOPTIONS
LCHOMEFILELTFILE1LTFILE2THISOFOXREGSETFOXOPTION	UPDATELOGLSTARTUP
EDITOROPTIONS
GETBACKUPFILE�������T��C�Q�foxrefs.dbf��%�C�0���	����Q�����%�CC�
����2%�CC�/f�CACTIVEX�CC�/f�CFNAME	����Q������C��FPT�����Q���T��CC�M�����	foxws.dbf��%�C�0����T��C�Q�foxcode.dbf��%�C�0����Q�����%�CC���A�B��#)�T��C�g��Q�Q�����%�CC�
����#)�%�C�g�����T��C�����(����Q������C��FPT�������C��An outdated web services table (FOXWS.DBF) was found, backed up and deleted in the original location. This table will automatically be recreated the next time you use one of the Web Services components.��	������Q�U

LCFILENAMELNFOXCODEVERLCBACKUPFILE
LCHOMEFILETHISLSTARTUPEXPANDEDNAME
GETBACKUPFILE	UPDATELOG{����
T�����1%�C���.chm����������%�C�chm.file�������1��C��chm.file�.chm��a�������
T�����5%�C���chm.file��������t�%�C�	HTML Help�����p�"T��CC�windir5���hh.exe��!%�CC�windir5�
�C�0	��l�X��C�HThe HTML Help (.CHM) file extension was found to be broken and restored.����D��C��Compiled HTML Help file�chm.file��a�����?��C���,0�chm.file\DefaultIcon��a�����M��C��"��" %1�chm.file\shell\open\command��a��������ULCHHEXELCVALUETHISOFOXREG	GETREGKEY	SETREGKEY	UPDATELOG������:T���
applications\C�C����\shell\open\command��
T�����.%�C�������������B��%�C������B��"T��CC�CC�C�����=���%�C��=�"����T��C��\���%�C�0���B��F��C��"�C��"� -SHELLOPEN "%1"���a�����^��C�NThe HKCR Applications registry key for Visual FoxPro was invalid and restored.����U	LCFILELCVALUELCKEY
SERVERNAMETHISOFOXREG	GETREGKEY	SETREGKEY	UPDATELOGU���%�C���
��3����C������T���C�������UTCDESCTHISALOGS�%��C����t�Z��C�NThis utility can only be run in the full development version of Visual FoxPro.�x��B�-���+T���C�foxreg�..\FFC\registry���%�C�����O����B�-���T���������U	STARTMODETHISOFOXREGALOGS�����%�����l�Q��C�EChanges were made that require you to quit and restart Visual FoxPro.�x���%���������C�_STARTUP�������%��������T��ىVFPClean detected and repaired the following issues (note -- the IntelliSense Manager will automatically check for valid Foxcode tables):C�
 C�
 ��%�C�������,T���C�
 C�
 �No issues found�����%�C���=�_���iT���C�
 C�
 �@The following Visual FoxPro options registry keys were updated: C�
 C�
 ��������(�C������!%�CC�
����=�_����'T���C�
���C�
 C�
 �����3T���C�
 C�
 C�
���C�
 C�
 ��������C��x���U	LCLOGSTRITHISLREQUIRESRESTARTLSTARTUPOFOXREGSETFOXOPTIONLDISPLAYLOGALOGSW�����T���a��%�-��P�(���VFPClean Error: ������UNERRORCMETHODNLINETHIS	LHADERROR
StartClean�CheckStartup�CleanFoxRegCleanSamplesCheckFoxRegl	
GetBackupFile�CleanFoxTask~CleanFoxCode�
CleanFoxXtras�	CleanCHMsCleanAppKey�	UpdateLog�InitLDestroyPError�!
T�����T��-��T��-��T��-��T��-��T��-��T��-��T��-��T��-��T�	�-��
�
����
���
���
���
���
���
���
���
���
��	�
��
�
���
���
��
�
���
���UOFOXREG	LHADERRORLSTARTUPLSHOWMSGBOX
LSKIPOLDFILESLSKIPOLDFILESMSGBOXLSKIPNONDEFFILESLSKIPNONDEFFILESMSGBOXLREQUIRESRESTARTLDISPLAYLOGALOGSvfpcleanSession>#�q�QAA�1!AA��������3��1q%����qAAA3����������a������3q�1�AAq�AAAAQ��3������AA��AAq�AAA�AA#�AAA��A�A�AAA���A�AAAAA3q����AAA�3q���A3����AAAC�AA�
AA�q!Aq!A�S���A�Q���AAA�32����!A�QAAAA������AAQ�A��Q1Q�A�Q�
AAAAA3���AA�Q�!�A��AAA3����AA�AA!q!A�AAb�3q1�A�31�qA��qAa3�A�A!
!����A�q�1AAA�A3����A3������������� �0�����������`�����7	z
b6�YD&}W8'�kH��|��d���o ��� �%���%o*��*b.>��..1X;1�1n�1�2v3�5�2�56�8t#6(0
mPLATFORMCUNIQUEIDC	
TIMESTAMPN
CLASSMCLASSLOCM!BASECLASSM%OBJNAMEM)PARENTM-PROPERTIESM1PROTECTEDM5METHODSM9OBJCODEM=OLEMAOLE2MERESERVED1MIRESERVED2MMRESERVED3MQRESERVED4MURESERVED5MYRESERVED6M]RESERVED7MaRESERVED8MeUSERMi
 COMMENT Class                WINDOWS _RJL0UV82J 621908248������ax��jX COMMENT RESERVED            f< WINDOWS _RJL0V1NVV 693857578�������n{�`N COMMENT RESERVED            �x WINDOWS _RJL0UXJVX 693857586dV-<v"�7��� COMMENT RESERVED            - WINDOWS _RJL0UQOZ1 693857602������-�]<�� COMMENT RESERVED            tA WINDOWS _RJL0U66ZY 754413991z3���dEdqe@VD COMMENT RESERVED            4��VERSION =   3.00
registry.h�a\r�1registry
registry.hPixelsClass1customregistry�nuserkey = 0
cvfpoptpath = 
cregdllfile = 
cinidllfile = 
codbcdllfile = 
ncurrentos = 0
ncurrentkey = 0
capppathkey = 
Name = "registry"
custom
registry.h�a\r�11foxreg	oldinireg
registry.hPixelsClassregistry	oldiniregName = "oldinireg"
customregistry.vcx
registry.h�a\r�1odbcreg
registry.h�a\r�1
registry.hPixelsClass1registryfoxregName = "foxreg"
customregistry.vcx
registry.hPixelsClass1registryodbcregName = "odbcreg"
customregistry.vcx
registry.h�a\r�1filereg�*setfoxoption Sets an option from FoxPro registry settings.
*getfoxoption Retrieves an option from FoxPro registry settings.
*enumfoxoptions 
�*getinisection Retrieves information from INI section.
*getinientry Retrieves information from INI entry.
*writeinientry Writes a specific INI entry.
*loadinifuncs Loads functions needed for reading INI files.
h�� OO�%��DN�UD�����������
T�����%�C�
m.cINIFileb�C��Z�
T������&%�C����
��������
B�������T��CC� �
�������
���
T����������(��
���4�T�	�CC� �
��
���)T���
���C�
��
��
�	�
�\��T���
�	�����	B����U
	ASECTIONSCSECTIONCINIFILE	CINIVALUENTOTENTRIESINLASTPOSTHISGETINIENTRYNTMPPOSZ������������
T��C�t��T��C��	��%��
����b�B��
����%��
��
����T�
������T�
��C��X��%�C�
������*T�
��C�
��
���C�
�>�
����0T�
��C�
��
���C�
�>�
�����%��
����2�
B�������T�
��C�
��
�=��	B����UCVALUECSECTIONCENTRYCINIFILECBUFFERNBUFSIZENERRNUM	NTOTPARMSTHISLOADINIFUNCS	GETWININI
GETPRIVATEINI����������T��C����%��
����I�B��
����%�C�
����~� T��C�
��
��
�������&T��C�
��
��
��
�����B�C�
������
�6��U	CVALUECSECTIONCENTRYCINIFILENERRNUMTHISLOADINIFUNCSWRITEWININIWRITEPRIVATEINIW%������	B�����G|�GetPrivateProfileString�Win32APIQ�
GetPrivateINI������%�����~�
B�������:|�GetProfileString�Win32APIQ�	GetWinINI�����:|�WriteProfileString�Win32APIQ�WriteWinINI���G|�WritePrivateProfileString�Win32APIQ�WritePrivateINI����T���a��	B����UTHISLLOADEDINISGETPRIVATEPROFILESTRINGWIN32API
GETPRIVATEINI	LHADERRORGETPROFILESTRING	GETWININIWRITEPROFILESTRINGWRITEWININIWRITEPRIVATEPROFILESTRINGWRITEPRIVATEINI
getinisection,��getinientry���
writeinientry���loadinifuncs���1�1���Ab�Ab�����1A�313�1�A3�A"��A2�A��31s1�A�bA�3�As�A��s��27YC*g:?7]�	W)O�*loadodbcfuncs Loads ODBC registry functions.
*getodbcdrvrs Retrieves ODBC drivers.
*enumodbcdrvrs Enumerates through ODBC drivers.
*enumodbcdata Enumerates through ODBC data sources.

registry.hPixelsClass1registryfilereg�*getapppath Checks and returns path of application associated with a particular extension (e.g., XLS, DOC).
*getlatestversion Returns latest version for a specified application.
*getapplication Retrieves application key.
Name = "filereg"
customregistry.vcx�PROCEDURE setfoxoption
LPARAMETER cOptName,cOptVal
RETURN THIS.SetRegKey(cOptName,cOptVal,THIS.cVFPOptPath,THIS.nUserKey)

ENDPROC
PROCEDURE getfoxoption
LPARAMETER cOptName,cOptVal
RETURN THIS.GetRegKey(cOptName,@cOptVal,THIS.cVFPOptPath,THIS.nUserKey)

ENDPROC
PROCEDURE enumfoxoptions
LPARAMETER aFoxOpts
RETURN THIS.EnumOptions(@aFoxOpts,THIS.cVFPOptPath,THIS.nUserKey,.F.)

ENDPROC
B�� ))I%h�
��U/����!B�C����������UCOPTNAMECOPTVALTHIS	SETREGKEYCVFPOPTPATHNUSERKEY/����!B�C����������UCOPTNAMECOPTVALTHIS	GETREGKEYCVFPOPTPATHNUSERKEY(���B�C�����-����UAFOXOPTSTHISENUMOPTIONSCVFPOPTPATHNUSERKEYsetfoxoption,��getfoxoption���enumfoxoptions��1�3�3q�2}�+�))PROCEDURE getapppath
* Checks and returns path of application
* associated with a particular extension (e.g., XLS, DOC). 
LPARAMETER cExtension,cExtnKey,cAppKey,lServer
LOCAL nErrNum,cOptName
cOptName = ""

* Check Extension parameter
IF TYPE("m.cExtension") # "C" OR LEN(m.cExtension) > 3
	RETURN ERROR_BADPARM
ENDIF
m.cExtension = "."+m.cExtension

* Open extension key
nErrNum = THIS.OpenKey(m.cExtension)
IF m.nErrNum  # ERROR_SUCCESS
	RETURN m.nErrNum
ENDIF

* Get key value for file extension
nErrNum = THIS.GetKeyValue(cOptName,@cExtnKey)

* Close extension key
THIS.CloseKey()

IF m.nErrNum  # ERROR_SUCCESS
	RETURN m.nErrNum
ENDIF
RETURN THIS.GetApplication(cExtnKey,@cAppKey,lServer)

ENDPROC
PROCEDURE getlatestversion
LPARAMETER cClass,cExtnKey,cAppKey,lServer

LOCAL nErrNum,cOptName
cOptName = ""

* Open class key (e.g., Excel.Sheet)
nErrNum = THIS.OpenKey(m.cClass+CURVER_KEY)
IF m.nErrNum  # ERROR_SUCCESS
	RETURN m.nErrNum
ENDIF

* Get key value for file extension
nErrNum = THIS.GetKeyValue(cOptName,@cExtnKey)

* Close extension key
THIS.CloseKey()

IF m.nErrNum  # ERROR_SUCCESS
	RETURN m.nErrNum
ENDIF
RETURN THIS.GetApplication(cExtnKey,@cAppKey,lServer)

ENDPROC
PROCEDURE getapplication
LPARAMETERS cExtnKey,cAppKey,lServer

LOCAL nErrNum,cOptName
cOptName = ""

* lServer - checking for OLE server.
IF TYPE("m.lServer") = "L" AND m.lServer
	THIS.cAppPathKey = OLE_PATH_KEY
ELSE	
	THIS.cAppPathKey = APP_PATH_KEY
ENDIF

* Open extension app key
m.nErrNum = THIS.OpenKey(m.cExtnKey+THIS.cAppPathKey)
IF m.nErrNum  # ERROR_SUCCESS
	RETURN m.nErrNum
ENDIF

* Get application path
nErrNum = THIS.GetKeyValue(cOptName,@cAppKey)

* Close application path key
THIS.CloseKey()

RETURN m.nErrNum

ENDPROC
��� ��l�%�-1��U����������
T�����/%�C�m.cExtensionb�C�C�
�>���d�
B�������T�
���.�
���T��C�
�����%��
������B��
����T��C������
��C��	��%��
������B��
����B�C�����
��U
CEXTENSIONCEXTNKEYCAPPKEYLSERVERNERRNUMCOPTNAMETHISOPENKEYGETKEYVALUECLOSEKEYGETAPPLICATION�����������
T�����!T��C�
��\CurVer����%��
����j�B��
����T��C������
��C��	��%��
������B��
����B�C�����
��UCCLASSCEXTNKEYCAPPKEYLSERVERNERRNUMCOPTNAMETHISOPENKEYGETKEYVALUECLOSEKEYGETAPPLICATION ���������
T�����&%�C�	m.lServerb�L��
�	��|�/T����\Protocol\StdFileEditing\Server�����#T����\Shell\Open\Command���T�
��C�
�������%��
������B��
����T��C������
��C��	��B��
���U
CEXTNKEYCAPPKEYLSERVERNERRNUMCOPTNAMETHISCAPPPATHKEYOPENKEYGETKEYVALUECLOSEKEY
getapppath,��getlatestversion���getapplication���13����Aas1�A��2�A�31��1�A��2�A�3���c��1A�1�A���2��� !�8)�IPROCEDURE loadodbcfuncs
IF THIS.lLoadedODBCs
	RETURN ERROR_SUCCESS
ENDIF

* Check API file containing functions

IF EMPTY(THIS.cODBCDLLFile)
	RETURN ERROR_NOODBCFILE
ENDIF

LOCAL henv,fDirection,szDriverDesc,cbDriverDescMax
LOCAL pcbDriverDesc,szDriverAttributes,cbDrvrAttrMax,pcbDrvrAttr
LOCAL szDSN,cbDSNMax,pcbDSN,szDescription,cbDescriptionMax,pcbDescription

DECLARE Short SQLDrivers IN (THIS.cODBCDLLFile) ;
	Integer henv, Integer fDirection, ;
	String @ szDriverDesc, Integer cbDriverDescMax, Integer pcbDriverDesc, ;
	String @ szDriverAttributes, Integer cbDrvrAttrMax, Integer pcbDrvrAttr

IF THIS.lhaderror && error loading library
	RETURN -1
ENDIF

DECLARE Short SQLDataSources IN (THIS.cODBCDLLFile) ;
	Integer henv, Integer fDirection, ;
	String @ szDSN, Integer cbDSNMax, Integer @ pcbDSN, ;
	String @ szDescription, Integer cbDescriptionMax,Integer pcbDescription

THIS.lLoadedODBCs = .T.

RETURN ERROR_SUCCESS

ENDPROC
PROCEDURE getodbcdrvrs
LPARAMETERS aDrvrs,lDataSources
LOCAL nODBCEnv,nRetVal,dsn,dsndesc,mdsn,mdesc

lDataSources = IIF(TYPE("m.lDataSources")="L",m.lDataSources,.F.)

* Load API functions
nRetVal = THIS.LoadODBCFuncs()
IF m.nRetVal # ERROR_SUCCESS
	RETURN m.nRetVal
ENDIF

* Get ODBC environment handle
nODBCEnv=VAL(SYS(3053))

* -- Possible error messages
* 527 "cannot load odbc library"
* 528 "odbc entry point missing"
* 182 "not enough memory"

IF INLIST(nODBCEnv,527,528,182)
	* Failed
	RETURN ERROR_ODBCFAIL
ENDIF

DIMENSION aDrvrs[1,IIF(m.lDataSources,2,1)]
aDrvrs[1] = ""

DO WHILE .T.
	dsn=space(100)
	dsndesc=space(100)
	mdsn=0
	mdesc=0

	* Return drivers or data sources
	IF m.lDataSources
		nRetVal = SQLDataSources(m.nODBCEnv,SQL_FETCH_NEXT,@dsn,100,@mdsn,@dsndesc,255,@mdesc)
	ELSE
		nRetVal = SQLDrivers(m.nODBCEnv,SQL_FETCH_NEXT,@dsn,100,@mdsn,@dsndesc,100,@mdesc)
	ENDIF
		
	DO CASE
		CASE m.nRetVal = SQL_NO_DATA
			nRetVal = ERROR_SUCCESS
			EXIT
		CASE m.nRetVal # ERROR_SUCCESS AND m.nRetVal # 1 
			EXIT
		OTHERWISE
			IF !EMPTY(aDrvrs[1])
				IF m.lDataSources
					DIMENSION aDrvrs[ALEN(aDrvrs,1)+1,2]
				ELSE
					DIMENSION aDrvrs[ALEN(aDrvrs,1)+1,1]
				ENDIF
			ENDIF
			dsn = ALLTRIM(m.dsn)
			aDrvrs[ALEN(aDrvrs,1),1] = LEFT(m.dsn,LEN(m.dsn)-1)
			IF m.lDataSources
				dsndesc = ALLTRIM(m.dsndesc)				
				aDrvrs[ALEN(aDrvrs,1),2] = LEFT(m.dsndesc,LEN(m.dsndesc)-1)			
			ENDIF
	ENDCASE
ENDDO
RETURN nRetVal

ENDPROC
PROCEDURE enumodbcdrvrs
LPARAMETER aDrvrOpts,cODBCDriver
LOCAL cSourceKey
cSourceKey = ODBC_DRVRS_KEY+m.cODBCDriver
RETURN THIS.EnumOptions(@aDrvrOpts,m.cSourceKey,HKEY_LOCAL_MACHINE,.F.)

ENDPROC
PROCEDURE enumodbcdata
LPARAMETER aDrvrOpts,cDataSource
LOCAL cSourceKey
cSourceKey = ODBC_DATA_KEY+cDataSource
RETURN THIS.EnumOptions(@aDrvrOpts,m.cSourceKey,HKEY_CURRENT_USER,.F.)

ENDPROC
	�PROCEDURE getinisection
LPARAMETERS aSections,cSection,cINIFile
LOCAL cINIValue, nTotEntries, i, nLastPos
cINIValue = ""
IF TYPE("m.cINIFile") # "C"
	cINIFile = ""
ENDIF

IF THIS.GetINIEntry(@cINIValue,cSection,0,m.cINIFile) # ERROR_SUCCESS
	RETURN ERROR_FAILINI
ENDIF

nTotEntries=OCCURS(CHR(0),m.cINIValue)
DIMENSION aSections[m.nTotEntries]
nLastPos = 1
FOR i = 1 TO m.nTotEntries
	nTmpPos = AT(CHR(0),m.cINIValue,m.i)
	aSections[m.i] = SUBSTR(m.cINIValue,m.nLastPos,m.nTmpPos-m.nLastPos)
	nLastPos = m.nTmpPos+1
ENDFOR

RETURN ERROR_SUCCESS

ENDPROC
PROCEDURE getinientry
LPARAMETER cValue,cSection,cEntry,cINIFile

* Get entry from INI file 
LOCAL cBuffer,nBufSize,nErrNum,nTotParms
nTotParms = PCOUNT()

* Load API functions
nErrNum= THIS.LoadINIFuncs()
IF m.nErrNum # ERROR_SUCCESS
	RETURN m.nErrNum
ENDIF

* Parameter checks here
IF m.nTotParms < 3
	m.cEntry = 0
ENDIF

m.cBuffer=space(2000)

IF EMPTY(m.cINIFile)
	* WIN.INI file
	m.nBufSize = GetWinINI(m.cSection,m.cEntry,"",@cBuffer,LEN(m.cBuffer))
ELSE
	* Private INI file
	m.nBufSize = GetPrivateINI(m.cSection,m.cEntry,"",@cBuffer,LEN(m.cBuffer),m.cINIFile)
ENDIF

IF m.nBufSize = 0 &&could not find entry in INI file
	RETURN ERROR_NOINIENTRY
ENDIF

m.cValue=LEFT(m.cBuffer,m.nBufSize)

** All is well
RETURN ERROR_SUCCESS

ENDPROC
PROCEDURE writeinientry
LPARAMETER cValue,cSection,cEntry,cINIFile

* Get entry from INI file 
LOCAL nErrNum

* Load API functions
nErrNum = THIS.LoadINIFuncs()
IF m.nErrNum # ERROR_SUCCESS
	RETURN m.nErrNum
ENDIF

IF EMPTY(m.cINIFile)
	* WIN.INI file
	nErrNum = WriteWinINI(m.cSection,m.cEntry,m.cValue)
ELSE
	* Private INI file
	nErrNum = WritePrivateINI(m.cSection,m.cEntry,m.cValue,m.cINIFile)
ENDIF
		
** All is well
RETURN IIF(m.nErrNum=1,ERROR_SUCCESS,m.nErrNum)

ENDPROC
PROCEDURE loadinifuncs
* Loads funtions needed for reading INI files
IF THIS.lLoadedINIs
	RETURN ERROR_SUCCESS
ENDIF

DECLARE integer GetPrivateProfileString IN Win32API ;
	AS GetPrivateINI string,string,string,string,integer,string

IF THIS.lhaderror && error loading library
	RETURN -1
ENDIF

DECLARE integer GetProfileString IN Win32API ;
	AS GetWinINI string,string,string,string,integer

DECLARE integer WriteProfileString IN Win32API ;
	AS WriteWinINI string,string,string

DECLARE integer WritePrivateProfileString IN Win32API ;
	AS WritePrivateINI string,string,string,string

THIS.lLoadedINIs = .T.

* Need error check here
RETURN ERROR_SUCCESS

ENDPROC
��� }}ђ%Kn�U%������	B�����%�C�����9�
B�����������������	�
�����
����-|W�
SQLDrivers������������%�������
B�������2|W�SQLDataSources������������T���a��	B����UTHISLLOADEDODBCSCODBCDLLFILEHENV
FDIRECTIONSZDRIVERDESCCBDRIVERDESCMAX
PCBDRIVERDESCSZDRIVERATTRIBUTES
CBDRVRATTRMAXPCBDRVRATTRSZDSNCBDSNMAXPCBDSN
SZDESCRIPTIONCBDESCRIPTIONMAXPCBDESCRIPTION
SQLDRIVERS	LHADERRORSQLDATASOURCES!������������0T��CC�m.lDataSourcesb�L��
��-6��T��C��	��%��
������B��
����T��CC��]g��%�C����������
B�������#�����C�
�����6��T��������+�a���T��C�dX��T��C�dX��
T�����
T�����%��
���y�-T��C�
����d������
�����-T��C�
����d���d�����
H���
���
��d����
T�����!� ��
���
�
��	���!�2�
�%�CC���
��x�%��
���O���C���������t���C����������T��C�
����.T��C�������C�
�C�
�>�=��%��
���	�T��C�
����.T��C�������C�
�C�
�>�=�����	B����UADRVRSLDATASOURCESNODBCENVNRETVALDSNDSNDESCMDSNMDESCTHIS
LOADODBCFUNCSSQLDATASOURCES
SQLDRIVERSa�������.T���Software\ODBC\ODBCINST.INI\�
���B�C��
���-����U	ADRVROPTSCODBCDRIVER
CSOURCEKEYTHISENUMOPTIONS[�������(T���Software\ODBC\ODBC.INI\���B�C��
���-����U	ADRVROPTSCDATASOURCE
CSOURCEKEYTHISENUMOPTIONS
loadodbcfuncs,��getodbcdrvrsH��
enumodbcdrvrs���enumodbcdata~��1�A$�A21���A%��3��1�A#��A21���������A�1�AA�A����AA���AAA�3�q��3�q��2���	#A�	w
eF�
>l)}�nuserkey User registry key.
cvfpoptpath Registry path to VFP options settings.
cregdllfile DLL file for registry functions.
cinidllfile DLL file for INI functions.
codbcdllfile DLL file for ODBC functions.
ncurrentos Current operating system code.
ncurrentkey Current registry key.
lloadeddlls Whether registry key functions loaded.
lloadedinis Whether INI functions loaded.
capppathkey Application path registry key.
lcreatekey Whether to create key if one does not already exist.
lhaderror Whether an error occurred.
lloadedodbcs Whether ODBC functions loaded.
ldisallowexpanded
lhasdllloaded
*loadregfuncs Loads funtions needed for Registry.
*openkey Opens a registry key.
*closekey Closes a registry key.
*setregkey Sets a registry key setting.
*getregkey Gets a registry key setting.
*getkeyvalue Obtains a value from a registry key.
*setkeyvalue Sets a key value.
*deletekey Deletes a registry key.
*enumoptions Enumerates through all entries for a key and populates array.
*iskey Checks to see if a key exists.
*enumkeys Enumerates through a registry key.
*enumkeyvalues Enumerates through values of a registry key
*deletekeyvalue Deletes value from registry key.
s�� ZZ��%�! ��UU�������������	���
���
�����������%�����x�	B�����%|�
RegOpenKey�Win32API����%�������
B�������'|�RegCreateKey�Win32API����$|�RegDeleteKey�Win32API���%|�RegDeleteValue�Win32API�� |�RegCloseKey�Win32API�,|�
RegSetValueEx�Win32API������1|�RegQueryValueEx�Win32API�������'|�
RegEnumKey�Win32API�����4|�RegEnumKeyEx�Win32API���������4|�RegEnumValue�Win32API���������T���a��	B����U"NHKEYCSUBKEYNRESULTHKEYIVALUE	LPSZVALUE
LPCCHVALUELPDWTYPELPBDATALPCBDATALPCSTRLPSZVALNLENLPDWRESERVED
LPSZVALUENAME
DWRESERVEDFDWTYPEISUBKEYLPSZNAMECCHNAMETHISLLOADEDDLLS
REGOPENKEYWIN32API	LHADERRORREGCREATEKEYREGDELETEKEYREGDELETEVALUEREGCLOSEKEY
REGSETVALUEEXREGQUERYVALUEEX
REGENUMKEYREGENUMKEYEXREGENUMVALUE������������
T�����
T��C�t��(%�C�	m.nRegKeyb�N�C�
����{�T�
������T��C����%��
������B��
����T������-%��
���C�m.lCreateKeyb�L	���T����
����%�����3�T��C�
��
���	���Y�T��C�
��
���
���T����
���%�������B��
����T����
���	B����U
CLOOKUPKEYNREGKEY
LCREATEKEYNSUBKEYNERRCODENPCOUNTLSAVECREATEKEYTHISLOADREGFUNCSREGCREATEKEY
REGOPENKEYNCURRENTKEY#��C�����T������UREGCLOSEKEYTHISNCURRENTKEY��������������
T�����
T�����
T�����%T�
��C�
��
��
��	�
��%��
������B��
����T��C�
��
��	���
��C�	���B��
���U
COPTNAMECOPTVALCKEYPATHNUSERKEY
LCREATEKEYIPOSCOPTKEYCOPTIONNERRNUMTHISOPENKEYSETKEYVALUECLOSEKEY������������
T�����
T�����
T�����T�
��C�
��
�����%��
������B��
����T��C����	��
��C��
��B��
���UCOPTNAMECOPTVALCKEYPATHNUSERKEYIPOSCOPTIONNERRNUMTHISOPENKEYGETKEYVALUECLOSEKEYs�����������J���(���J�C�X�(��J�C�
�>�(�
��
H�c���2�C�THIS.nCurrentKeyb�N��������
B������ �C�m.cValueNameb�C����
B�������.T�
��C���
��
�����	��%��
�����B��
���� %��
���
�
��	��G�
B�������T�
��C�
��
��=��	B����U

CVALUENAME	CKEYVALUELPDWRESERVEDLPDWTYPELPBDATALPCBDATANERRCODETHISNCURRENTKEYREGQUERYVALUEEX%��������
H�#���2�C�THIS.nCurrentKeyb�N������_�
B������6�C�m.cValueNameb�C�C�m.cValueb�C����
B�������T���
�C� ��T��C�
�>��.T�
��C���
����
��
����%��
�����B��
����	B����U
CVALUENAMECVALUE
NVALUESIZENERRCODETHISNCURRENTKEY
REGSETVALUEEXI�������
T�����T�
��C�
��
����B��
���UNUSERKEYCKEYPATHNERRNUMREGDELETEKEY#�����������
T�����
T�����
T�����*%�C�t�
�C�m.lEnumKeysb�L��~�T��-���T�
��C�
��
�����%��
������B��
����%��
�����T��C���	����T��C���
���
��C����B��
���UAREGOPTSCOPTPATHNUSERKEY	LENUMKEYSIPOSCOPTIONNERRNUMTHISOPENKEYENUMKEYS
ENUMKEYVALUESCLOSEKEYe�������T��C�
��
�����%��
����O�
��C�����B��
����UCKEYNAMENREGKEYNERRNUMTHISOPENKEYCLOSEKEY�������������
T�����
�����+�a����
T�����T��C�dX��T��C�
�>��T��C�dX��T��C�
�>��T��C�dX��3T�
��C�	�
�
����������
H������
�����!���
�����!��T��C�
����T��C�
�C�
�>�=��%�CC���
��p���C�����T��C����
���T���
�����!%��
���
�
��	����T�
������B��
���U	AKEYNAMES	NKEYENTRYCNEWKEYCBUFNBUFLENCRETTIMENKEYSIZENERRCODEREGENUMKEYEXTHISNCURRENTKEY(�����������������
J���(��2%�C�THIS.nCurrentKeyb�N��	�
���y�
B�������%��	������
B�������+�a����J���(����J�C�X�(���J�C�>�(�
��J�C�>�(�
��4T��C�	�
�
����
�������
H�7�f���
����O�!���
����f�!��T���
�������
������$T���
������C�
��
�=��
H������������(T���
������C�
��
��=�������	�

	��@�(T���
������C�
��
��=�������t�#T���
�������*Binary*���������(T���
������C�
��
��=��2���)T���
�������*Unknown type*����!%��
���
�
��	���T�
������B��
���U
AKEYVALUES	LPSZVALUE
LPCCHVALUELPDWRESERVEDLPDWTYPELPBDATALPCBDATANERRCODE	NKEYENTRYTHISNCURRENTKEY
NCURRENTOSREGENUMVALUELDISALLOWEXPANDED����������
T�����
T�����T�
��C�
��
�����%��
����q�B��
����T�
��C���
����
��C��	��B��
���U
COPTNAMECKEYPATHNUSERKEYCOPTIONNERRNUMTHISOPENKEYREGDELETEVALUENCURRENTKEYCLOSEKEY�����
�����T�������BT���� Software\Microsoft\VisualFoxPro\�C��\Options��
H�z�/���2��4��3����B�-��!�C�	Windows 3C�J������T������"�C�
Windows NTC�J����N�T������T����ADVAPI32.DLL��T����KERNEL32.DLL��T��	��
ODBC32.DLL���CC�Jg�����T������T����ADVAPI32.DLL��T����KERNEL32.DLL��T��	��
ODBC32.DLL��2�/�T������T����ADVAPI32.DLL��T����KERNEL32.DLL��T��	��
ODBC32.DLL���T��C����%�������1%�C��
RegOpenKey����������������T��
�a����U	LATMPDLLSLNDLLSTHISNUSERKEYCVFPOPTPATHVERSION
NCURRENTOSCREGDLLFILECINIDLLFILECODBCDLLFILE
LHASDLLLOADED+�����T���a����CCE�x��UNERRORCMETHODNLINETHIS	LHADERROR�%���
����V�
REGOPENKEY�V�REGCREATEKEY�V�REGDELETEKEY�V�REGDELETEVALUE�V�REGCLOSEKEY�V�
REGSETVALUEEX�V�REGQUERYVALUEEX�V�
REGENUMKEY�V�REGENUMKEYEX�V�REGENUMVALUE��UTHIS
LHASDLLLOADEDloadregfuncs,��openkey���closekey3��	setregkeyz��	getregkey���getkeyvalue���setkeyvalue�
��	deletekeyK��enumoptions���iskey]��enumkeys���
enumkeyvaluesQ��deletekeyvalue ��Init6��ErrorV��Destroy���1��1���AS�AsCS�sDE��3�2���qA1�A�!A���A"�A"�33u1���S1�A���35�����1�A���3�r1�!��A�3�A�A��3���!�a�CS�3�A�3�q���32������A�1�A�R�RA��3�q�1�A�3q��������2�AA1AA�AAA�1A�A�3r����"�AC�A�RAC�AA1AA2SA����2���AA�A�3�����1�A���3��1!��q!���Q�������A#�AA3���31QQqAa�1QQA1��
:4/
~
c7�
�iD
5�QW��f���v�a�|���'/�N���#:��#p%y��%n)��)�)��)+�)Z+'PROCEDURE loadregfuncs
* Loads funtions needed for Registry
LOCAL nHKey,cSubKey,nResult
LOCAL hKey,iValue,lpszValue,lpcchValue,lpdwType,lpbData,lpcbData
LOCAL lpcStr,lpszVal,nLen,lpdwReserved
LOCAL lpszValueName,dwReserved,fdwType
LOCAL iSubKey,lpszName,cchName

IF THIS.lLoadedDLLs
	RETURN ERROR_SUCCESS
ENDIF

DECLARE Integer RegOpenKey IN Win32API ;
	Integer nHKey, String @cSubKey, Integer @nResult

IF THIS.lhaderror && error loading library
	RETURN -1
ENDIF

DECLARE Integer RegCreateKey IN Win32API ;
	Integer nHKey, String @cSubKey, Integer @nResult

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

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 RegEnumKey IN Win32API ;
	Integer nHKey,Integer iSubKey, String @lpszName, Integer @cchName

DECLARE Integer RegEnumKeyEx IN Win32API ;
	Integer nHKey,Integer iSubKey, String @lpszName, Integer @cchName,;
	Integer dwReserved,String @lpszName, Integer @cchName,String @cchName

DECLARE Integer RegEnumValue IN Win32API ;
	Integer hKey, Integer iValue, String @lpszValue, ;
	Integer @lpcchValue, Integer lpdwReserved, Integer @lpdwType, ;
	String @lpbData, Integer @lpcbData
    		
THIS.lLoadedDLLs = .T.

* Need error check here
RETURN ERROR_SUCCESS

ENDPROC
PROCEDURE openkey
* Opens a registry key
LPARAMETER cLookUpKey,nRegKey,lCreateKey

LOCAL nSubKey,nErrCode,nPCount,lSaveCreateKey
nSubKey = 0
nPCount = PCOUNT()

IF TYPE("m.nRegKey") # "N" OR EMPTY(m.nRegKey)
	m.nRegKey = HKEY_CLASSES_ROOT
ENDIF

* Load API functions
nErrCode = THIS.LoadRegFuncs()
IF m.nErrCode # ERROR_SUCCESS
	RETURN m.nErrCode
ENDIF

lSaveCreateKey = THIS.lCreateKey
IF m.nPCount>2 AND TYPE("m.lCreateKey") = "L"
	THIS.lCreateKey = m.lCreateKey
ENDIF

IF THIS.lCreateKey
	* Try to open or create registry key
	nErrCode = RegCreateKey(m.nRegKey,m.cLookUpKey,@nSubKey)
ELSE
	* Try to open registry key
	nErrCode = RegOpenKey(m.nRegKey,m.cLookUpKey,@nSubKey)
ENDIF

THIS.lCreateKey = m.lSaveCreateKey

IF nErrCode # ERROR_SUCCESS
	RETURN m.nErrCode
ENDIF

THIS.nCurrentKey = m.nSubKey
RETURN ERROR_SUCCESS

ENDPROC
PROCEDURE closekey
* Closes a registry key
=RegCloseKey(THIS.nCurrentKey)
THIS.nCurrentKey =0 

ENDPROC
PROCEDURE setregkey
* This routine sets a registry key setting
* ex. THIS.SetRegKey("ResWidth","640",;
*		"Software\Microsoft\VisualFoxPro\6.0\Options",;
*		HKEY_CURRENT_USER)
LPARAMETER cOptName,cOptVal,cKeyPath,nUserKey,lCreateKey
LOCAL iPos,cOptKey,cOption,nErrNum
iPos = 0
cOption = ""
nErrNum = ERROR_SUCCESS

* Open registry key
m.nErrNum = THIS.OpenKey(m.cKeyPath,m.nUserKey,m.lCreateKey)
IF m.nErrNum # ERROR_SUCCESS
	RETURN m.nErrNum
ENDIF

* Set Key value
nErrNum = THIS.SetKeyValue(m.cOptName,m.cOptVal)

* Close registry key 
THIS.CloseKey()		&&close key
RETURN m.nErrNum

ENDPROC
PROCEDURE getregkey
* This routine gets a registry key setting
* ex. THIS.GetRegKey("ResWidth",@cValue,;
*		"Software\Microsoft\VisualFoxPro\4.0\Options",;
*		HKEY_CURRENT_USER)
LPARAMETER cOptName,cOptVal,cKeyPath,nUserKey
LOCAL iPos,cOption,nErrNum
iPos = 0
cOption = ""
nErrNum = ERROR_SUCCESS

* Open registry key
m.nErrNum = THIS.OpenKey(m.cKeyPath,m.nUserKey)
IF m.nErrNum # ERROR_SUCCESS
	RETURN m.nErrNum
ENDIF

* Get the key value
nErrNum = THIS.GetKeyValue(cOptName,@cOptVal)

* Close registry key 
THIS.CloseKey()		&&close key
RETURN m.nErrNum

ENDPROC
PROCEDURE getkeyvalue
* Obtains a value from a registry key
* Note: this routine only handles Data strings (REG_SZ)
LPARAMETER cValueName,cKeyValue

LOCAL lpdwReserved,lpdwType,lpbData,lpcbData,nErrCode
STORE 0 TO lpdwReserved,lpdwType
STORE SPACE(256) TO lpbData
STORE LEN(m.lpbData) TO m.lpcbData

DO CASE
CASE TYPE("THIS.nCurrentKey")#'N' OR THIS.nCurrentKey = 0
	RETURN ERROR_BADKEY
CASE TYPE("m.cValueName") #"C"
	RETURN ERROR_BADPARM
ENDCASE

m.nErrCode=RegQueryValueEx(THIS.nCurrentKey,m.cValueName,;
		m.lpdwReserved,@lpdwType,@lpbData,@lpcbData)

* Check for error 
IF m.nErrCode # ERROR_SUCCESS
	RETURN m.nErrCode
ENDIF

* Make sure we have a data string data type
IF m.lpdwType # REG_SZ AND m.lpdwType # REG_EXPAND_SZ 
	RETURN ERROR_NONSTR_DATA		
ENDIF

m.cKeyValue = LEFT(m.lpbData,m.lpcbData-1)
RETURN ERROR_SUCCESS

ENDPROC
PROCEDURE setkeyvalue
* This routine sets a key value
* Note: this routine only handles data strings (REG_SZ)
LPARAMETER cValueName,cValue
LOCAL nValueSize,nErrCode 

DO CASE
CASE TYPE("THIS.nCurrentKey")#'N' OR THIS.nCurrentKey = 0
	RETURN ERROR_BADKEY
CASE TYPE("m.cValueName") #"C" OR TYPE("m.cValue")#"C"
	RETURN ERROR_BADPARM
*!*	CASE EMPTY(m.cValueName)
*!*		RETURN ERROR_BADPARM
ENDCASE

* Make sure we null terminate this guy
cValue = m.cValue+CHR(0)
nValueSize = LEN(m.cValue)

* Set the key value here
m.nErrCode = RegSetValueEx(THIS.nCurrentKey,m.cValueName,0,;
	REG_SZ,m.cValue,m.nValueSize)

* Check for error
IF m.nErrCode # ERROR_SUCCESS
	RETURN m.nErrCode
ENDIF

RETURN ERROR_SUCCESS

ENDPROC
PROCEDURE deletekey
* This routine deletes a Registry Key
LPARAMETER nUserKey,cKeyPath
LOCAL nErrNum
nErrNum = ERROR_SUCCESS

* Delete key
m.nErrNum = RegDeleteKey(m.nUserKey,m.cKeyPath)
RETURN m.nErrNum

ENDPROC
PROCEDURE enumoptions
* Enumerates through all entries for a key and populates array
LPARAMETER aRegOpts,cOptPath,nUserKey,lEnumKeys
LOCAL iPos,cOption,nErrNum
iPos = 0
cOption = ""
nErrNum = ERROR_SUCCESS

IF PCOUNT()<4 OR TYPE("m.lEnumKeys") # "L"
	lEnumKeys = .F.
ENDIF

* Open key
m.nErrNum = THIS.OpenKey(m.cOptPath,m.nUserKey)
IF m.nErrNum # ERROR_SUCCESS
	RETURN m.nErrNum
ENDIF

* Enumerate through keys
IF m.lEnumKeys
	* Enumerate and get key names
	nErrNum = THIS.EnumKeys(@aRegOpts)
ELSE
	* Enumerate and get all key values
	nErrNum = THIS.EnumKeyValues(@aRegOpts)
ENDIF

* Close key
THIS.CloseKey()		&&close key
RETURN m.nErrNum

ENDPROC
PROCEDURE iskey
* Checks to see if a key exists
LPARAMETER cKeyName,nRegKey
LOCAL nErrNum 
* Open extension key		
nErrNum = THIS.OpenKey(m.cKeyName,m.nRegKey)
IF m.nErrNum  = ERROR_SUCCESS
	* Close extension key
	THIS.CloseKey()
ENDIF

RETURN m.nErrNum = ERROR_SUCCESS

ENDPROC
PROCEDURE enumkeys
LPARAMETERS aKeyNames
LOCAL nKeyEntry,cNewKey,cbuf,nbuflen,cRetTime, nKeySize, nErrCode
nKeyEntry = 0
DIMENSION aKeyNames[1]
DO WHILE .T.
	nKeySize = 0
	cNewKey = SPACE(100)
	nKeySize = LEN(m.cNewKey)
	cbuf=space(100)
	nbuflen=len(m.cbuf)
	cRetTime=space(100)

	m.nErrCode = RegEnumKeyEx(THIS.nCurrentKey,m.nKeyEntry,@cNewKey,@nKeySize,0,@cbuf,@nbuflen,@cRetTime)
	
	DO CASE
	CASE m.nErrCode = ERROR_EOF
		EXIT
	CASE m.nErrCode # ERROR_SUCCESS
		EXIT
	ENDCASE

	cNewKey = ALLTRIM(m.cNewKey)
	cNewKey = LEFT(m.cNewKey,LEN(m.cNewKey)-1)
	IF !EMPTY(aKeyNames[1])
		DIMENSION aKeyNames[ALEN(aKeyNames)+1]
	ENDIF
	aKeyNames[ALEN(aKeyNames)] = m.cNewKey 
	nKeyEntry = m.nKeyEntry + 1
ENDDO

IF m.nErrCode = ERROR_EOF AND m.nKeyEntry # 0
	m.nErrCode = ERROR_SUCCESS
ENDIF
RETURN m.nErrCode

ENDPROC
PROCEDURE enumkeyvalues
* Enumerates through values of a registry key
LPARAMETER aKeyValues

LOCAL lpszValue,lpcchValue,lpdwReserved
LOCAL lpdwType,lpbData,lpcbData
LOCAL nErrCode,nKeyEntry

STORE 0 TO nKeyEntry

IF TYPE("THIS.nCurrentKey")#'N' OR THIS.nCurrentKey = 0
	RETURN ERROR_BADKEY
ENDIF

* Sorry, Win32s does not support this one!
IF THIS.nCurrentOS = OS_W32S
	RETURN ERROR_BADPLAT
ENDIF

DO WHILE .T.

	STORE 0 TO lpdwReserved,lpdwType,nErrCode
	STORE SPACE(256) TO lpbData, lpszValue
	STORE LEN(lpbData) TO m.lpcchValue
	STORE LEN(lpszValue) TO m.lpcbData

	nErrCode=RegEnumValue(THIS.nCurrentKey,m.nKeyEntry,@lpszValue,;
		@lpcchValue,m.lpdwReserved,@lpdwType,@lpbData,@lpcbData)
	
	DO CASE
	CASE m.nErrCode = ERROR_EOF
		EXIT
	CASE m.nErrCode # ERROR_SUCCESS
		EXIT
	ENDCASE

	nKeyEntry = m.nKeyEntry + 1

	* Set array values
	DIMENSION aKeyValues[m.nKeyEntry,2]
	aKeyValues[m.nKeyEntry,1] = LEFT(m.lpszValue,m.lpcchValue)
	DO CASE
	CASE lpdwType = REG_SZ
		aKeyValues[m.nKeyEntry,2] = LEFT(m.lpbData,m.lpcbData-1)
	CASE lpdwType = REG_EXPAND_SZ AND !THIS.lDisAllowExpanded
		aKeyValues[m.nKeyEntry,2] = LEFT(m.lpbData,m.lpcbData-1)
	CASE lpdwType = REG_BINARY
		* Don't support binary
		aKeyValues[m.nKeyEntry,2] = REG_BINARY_LOC
	CASE lpdwType = REG_DWORD
		* You will need to use ASC() to check values here.
		aKeyValues[m.nKeyEntry,2] = LEFT(m.lpbData,m.lpcbData-1)
	OTHERWISE
		aKeyValues[m.nKeyEntry,2] = REG_UNKNOWN_LOC
	ENDCASE
ENDDO

IF m.nErrCode = ERROR_EOF AND m.nKeyEntry#0
	m.nErrCode = ERROR_SUCCESS
ENDIF
RETURN m.nErrCode

ENDPROC
PROCEDURE deletekeyvalue
LPARAMETER cOptName,cKeyPath,nUserKey
LOCAL cOption,nErrNum
cOption = cOptName
nErrNum = ERROR_SUCCESS

* Open key
m.nErrNum = THIS.OpenKey(m.cKeyPath,m.nUserKey)
IF m.nErrNum # ERROR_SUCCESS
	RETURN m.nErrNum
ENDIF

* Delete the key value
m.nErrNum = RegDeleteValue(THIS.nCurrentKey,m.cOption)

* Close key
THIS.CloseKey()		&& close key
RETURN m.nErrNum

ENDPROC
PROCEDURE Init
LOCAL laTmpDLLs,lnDlls
DIMENSION laTmpDLLs[1]
THIS.nUserKey = HKEY_CURRENT_USER
THIS.cVFPOptPath = VFP_OPTIONS_KEY1 + _VFP.VERSION + VFP_OPTIONS_KEY2
DO CASE
	CASE _DOS OR _UNIX OR _MAC
		RETURN .F.
	CASE ATC("Windows 3",OS(1)) # 0
		THIS.nCurrentOS = OS_W32S
	CASE ATC("Windows NT",OS(1)) # 0
		THIS.nCurrentOS = OS_NT
		THIS.cRegDLLFile = DLL_ADVAPI_NT
		THIS.cINIDLLFile = DLL_KERNEL_NT	
		THIS.cODBCDLLFile = DLL_ODBC_NT
	CASE VAL(OS(3)) >= 5
		* Handle W2K, XP
		THIS.nCurrentOS = OS_NT
		THIS.cRegDLLFile = DLL_ADVAPI_NT
		THIS.cINIDLLFile = DLL_KERNEL_NT	
		THIS.cODBCDLLFile = DLL_ODBC_NT
	OTHERWISE
		* Windows 95
		THIS.nCurrentOS = OS_WIN95
		THIS.cRegDLLFile = DLL_ADVAPI_WIN95
		THIS.cINIDLLFile = DLL_KERNEL_WIN95
		THIS.cODBCDLLFile = DLL_ODBC_WIN95
ENDCASE

* Check if DLLs already loaded so we don't unload when done.
lnDlls = ADLLS(laTmpDLLs)
IF lnDlls > 0
	IF ASCAN(laTmpDLLs,"RegOpenKey",-1,-1,-1,1)#0
		THIS.lHasDllLoaded=.T.
	ENDIF
ENDIF

ENDPROC
PROCEDURE Error
LPARAMETERS nError, cMethod, nLine
THIS.lhaderror = .T.
=MESSAGEBOX(MESSAGE())

ENDPROC
PROCEDURE Destroy
IF !THIS.lHasDllLoaded
	CLEAR DLLS RegOpenKey
	CLEAR DLLS RegCreateKey
	CLEAR DLLS RegDeleteKey
	CLEAR DLLS RegDeleteValue
	CLEAR DLLS RegCloseKey
	CLEAR DLLS RegSetValueEx
	CLEAR DLLS RegQueryValueEx
	CLEAR DLLS RegEnumKey
	CLEAR DLLS RegEnumKeyEx
	CLEAR DLLS RegEnumValue
ENDIF
ENDPROC
vfpclean.prgc:\docume~1\vfpbuild\locals~1\temp\vfpclean.fxp..\ffc\registry.vcxregistry.vct))
1)�1>F�1~�>S