Avatar billede cromwell Nybegynder
01. juli 2003 - 02:09 Der er 13 kommentarer og
2 løsninger

Download txt fil

Er det ikke muligt at downloade en txt fil fra nettet med VB, og der så kommer en "standart" download vindue frem, som der normalt gør når man bruger windows og vil downloade en fil fra internettet??

Det skal nemlig være muligt for brugeren at bestemme hvor filen skal ligge + se hvor meget der er downloaded.
Der skal dog være en default download location, som jeg bestemmer. BTW så downloades der fra en fast internetside og en bestemt txt fil.
Er det ikke muligt at bruge en eller anden form for commondialog??

PS. Har set på mange af de svar der har været om dette emne, men ikke nogle hvor man kan se hvor meget man har downloaded + man selv kan bestemme hvor man vil downloade til.

PPS. 200 point til et nice svar:D
Avatar billede dk_akj Nybegynder
01. juli 2003 - 08:05 #1
Prøv lige at lægge denne kode på en form:

//akj

Private SessionHandle As Long
Private ConnectionHandle As Long
Public AbortDownload As Boolean
Private Declare Function InternetCloseHandle Lib "wininet" _
    (ByVal hInet As Long) As Integer
Private Declare Function InternetOpen Lib "wininet" Alias "InternetOpenA" _
    (ByVal sAgent As String, ByVal lAccessType As Long, _
    ByVal sProxyName As String, ByVal sProxyBypass As String, _
    ByVal lFlags As Long) As Long
Private Declare Function InternetOpenUrl Lib "wininet" Alias "InternetOpenUrlA" _
    (ByVal hOpen As Long, ByVal sURL As String, _
    ByVal sHeaders As String, ByVal lLength As Long, _
    ByVal lFlags As Long, ByVal lContext As Long) As Long
Private Declare Function InternetReadFile Lib "wininet" _
    (ByVal hFile As Long, ByVal tmp As String, _
    ByVal lNumBytesToRead As Long, bytesread As Long) As Integer

Public Function DownloadFile(ByVal URL As String, _
                            ByVal LocalFile As String) _
                              As Boolean

    Dim iBuffer As String * 2048, bytesread As Long
    Dim filedata As String, Filenum As Long

    AbortDownload = False

    On Error GoTo ErrProc
    If Left(URL, 7) <> "http://" Then
        URL = "http://" & URL
    End If

    Filenum = FreeFile
    Open LocalFile For Binary Access Write As #Filenum

    SessionHandle = _
        InternetOpen("OpenUrl", 0, vbNullString, vbNullString, 0)
    ConnectionHandle = InternetOpenUrl(SessionHandle, URL, _
                    vbNullString, 0, INTERNET_FLAG_RELOAD, 0)
    Do
        iBuffer = vbNullString
        InternetReadFile ConnectionHandle, iBuffer, _
                                  Len(iBuffer), bytesread
        DoEvents
        If AbortDownload Or bytesread = 0 Then
          Exit Do
        Else
          filedata = Left(iBuffer, bytesread)
          Put #Filenum, , filedata
        End If
    Loop
    If ConnectionHandle <> 0 Then
        InternetCloseHandle ConnectionHandle
    End If
    If SessionHandle <> 0 Then
        InternetCloseHandle SessionHandle
    End If
    Close #Filenum

    If AbortDownload Then
        Kill LocalFile
        DownloadFile = False
    ElseIf FileLen(LocalFile) > 0 Then
        DownloadFile = True
    Else
        DownloadFile = False
    End If

    Exit Function

ErrProc:

    Close #Filenum
    DownloadFile = False

End Function


Private Sub Command1_Click()
DownloadFile "http://dinside.dk/dinfil.txt, "c:\temp\fil.txt"
End Sub
Avatar billede cromwell Nybegynder
01. juli 2003 - 12:33 #2
Tak for svaret, selv om det desværre ikke er godt nok, da jeg har en kode til at downloade en fil, som din kode gør, men der skal også være sådan at man kan se hvor meget man har downloaded.
Det bedste ville være en kode hvor programmet åbner windows til download, som man normalt bruger når man downloader noget fra nettet.
Avatar billede dk_akj Nybegynder
01. juli 2003 - 14:16 #3
Når det er en textfil er det vel begrænset hvor stor den kan være og betydningen af en progressbar er vel ikke så afgørende eller ???

//akj
Avatar billede dk_akj Nybegynder
01. juli 2003 - 14:25 #4
En løsning :-)

Lav en form med en webbrowsercontrol (Webbrowser1).

En commandbutton med flg kode:
WebBrowser1.Navigate "http://www.dinside.dk/download.asp", 4

Din download.asp skal se sådan ud:
<%
Response.Buffer =true
fil="dinfil.txt"  ' filen skal ligge i samme folder som download.asp
Response.ContentType = "application/binary"
Response.AddHeader "Content-Disposition", "attachment; filename=" +fil
Response.Flush()
Response.write " Her er filen "&vbcrlf
%>


//akj
Avatar billede sjh Nybegynder
01. juli 2003 - 14:35 #5
så må du kunne bruge den her:

Option Explicit

Private Declare Function DoFileDownload Lib "shdocvw.dll" (ByVal lpszFile As String) As Long

Public Sub DialogDownload(ByVal strURL As String)
  DoFileDownload StrConv(strURL, vbUnicode)
End Sub

Private Sub Form_Load()
  DialogDownload "http://www.eksperten.dk/images/banner/eksperten_problem_468x60.gif"
End Sub
Avatar billede cromwell Nybegynder
01. juli 2003 - 16:24 #6
dk_akj
Jeg ved ikke om jeg har gjort noget forkert, men den begynder at downloade download.asp i stedet for txt filen som jeg skrev i fil="dinfil.txt"

sjh
Det virker som det skal, jeg kan bare ikke lige finde ud at give en default download location, som når man f.eks. bruger commondialog med f.eks.
  CommonDialog1.InitDir = "c:\"
Så hvis du kan tilføje til koden så jeg selv kan bestemme default download location, så vil det være godt, og du vil få dine point.

PS. Jeg bruger txt filen som en database som brugeren kan opdatere, og selv om det er en txt fil, så kommer den op og fylder ca. 0,5 mb n måske mere, og så kan brugeren nem tro at programmet er gået ned, hvis man sidder med en lidt langsom internetforbindelse, hvor det måske tager 1 minut eller mere.
Avatar billede dk_akj Nybegynder
01. juli 2003 - 17:19 #7
Hvilen server ligger din fil på ?? Microsoft eller Linux ??

asp løsningen understøttes kun af MS.

Brug sjh's løsning den er meget simplere.

//akj
Avatar billede cromwell Nybegynder
01. juli 2003 - 17:32 #8
ja sjhs løsning ser ud til at være den bedste, men kan du eller sjh ikke skrive hvordan jeg bestemmer default download location
Avatar billede dk_akj Nybegynder
01. juli 2003 - 18:27 #9
Download folderen ligger i registry i flg nøgle.
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Download Directory

Der skriver du bare "c:\temp" eller lign. inden du kalder DialogDownload funktionen

//akj
Avatar billede sjh Nybegynder
01. juli 2003 - 22:29 #10
Her er lidt tricks med DoFileDownload:

http://www.mvps.org/vbnet/code/internet/dofiledownloadcustom.htm

Du skal nok lige rette i koden hvis det skal virke på en dansk win..ver.. ("File Download")

-->
  Do
    hwndDlg = FindWindow("#32770", "File Download")
  Loop While hwndDlg = 0
<--
Avatar billede cromwell Nybegynder
02. juli 2003 - 02:15 #11
dk_akj
Tak for det, men jeg kan ikke finde ud af at redigere i den, da jeg kun kender kommandoen savesetting men den ændrer kun under VB:/
Så hvordan ændrer man den sti som du har skrevet.

Sjh
har kigget på det, og har prøvet at se om jeg kunne bruge det til at finde ud af hvordan jeg ændrer download directory som dk_akj skriver, men de bruger alt for mange variabler og funktioner, så kan ikke lige finde rundt i det.

Vil derfor være glad hvis en af jer vil skrive koden til hvordan jeg bare ændrer download directory:D
BTW. i får begge points for jeres gode svar, men det sidste spørsmål/svar afgører så hvor meget i får:D
Tusind tak for hjælpen ind til videre
Avatar billede dk_akj Nybegynder
02. juli 2003 - 08:39 #12
Opret et "class module" (cRegistry.cls) indsæt koden mellem *'erne i modulet.

************************************************************
Option Explicit

' =========================================================
' Class:    cRegistry
' Author:  Steve McMahon
' Date  :  21 Feb 1997
'
' A nice class wrapper around the registry functions
' Allows searching,deletion,modification and addition
' of Keys or Values.
'
' Updated 29 April 1998 for VB5.
'  * Fixed GPF in EnumerateValues
'  * Added support for all registry types, not just strings
'  * Put all declares in local class
'  * Added VB5 Enums
'  * Added CreateKey and DeleteKey methods
'
' Updated 2 January 1999
'  * The CreateExeAssociation method failed to set up the
'    association correctly if the optional document icon
'    was not provided.
'  * Added new parameters to CreateExeAssociation to set up
'    other standard handlers: Print, Add, New
'  * Provided the CreateAdditionalEXEAssociations method
'    to allow non-standard menu items to be added (for example,
'    right click on a .VBP file.  VB installs Run and Make
'    menu items).
'
' Updated 8 February 2000
'  * Ensure CreateExeAssociation and related items sets up the
'    registry keys in the
'          HKEY_LOCAL_MACHINE\SOFTWARE\Classes
'    branch as well as the HKEY_CLASSES_ROOT branch.
'
' ---------------------------------------------------------------------------
' vbAccelerator - free, advanced source code for VB programmers.
'    http://vbaccelerator.com
' =========================================================

'Registry Specific Access Rights
Private Const KEY_QUERY_VALUE = &H1
Private Const KEY_SET_VALUE = &H2
Private Const KEY_CREATE_SUB_KEY = &H4
Private Const KEY_ENUMERATE_SUB_KEYS = &H8
Private Const KEY_NOTIFY = &H10
Private Const KEY_CREATE_LINK = &H20
Private Const KEY_ALL_ACCESS = &H3F

'Open/Create Options
Private Const REG_OPTION_NON_VOLATILE = 0&
Private Const REG_OPTION_VOLATILE = &H1

'Key creation/open disposition
Private Const REG_CREATED_NEW_KEY = &H1
Private Const REG_OPENED_EXISTING_KEY = &H2

'masks for the predefined standard access types
Private Const STANDARD_RIGHTS_ALL = &H1F0000
Private Const SPECIFIC_RIGHTS_ALL = &HFFFF

'Define severity codes
Private Const ERROR_SUCCESS = 0&
Private Const ERROR_ACCESS_DENIED = 5
Private Const ERROR_INVALID_DATA = 13&
Private Const ERROR_MORE_DATA = 234 '  dderror
Private Const ERROR_NO_MORE_ITEMS = 259


'Structures Needed For Registry Prototypes
Private Type SECURITY_ATTRIBUTES
  nLength As Long
  lpSecurityDescriptor As Long
  bInheritHandle As Boolean
End Type

Private Type FILETIME
  dwLowDateTime As Long
  dwHighDateTime As Long
End Type

'Registry Function Prototypes
Private Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" _
  (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, _
  ByVal samDesired As Long, phkResult As Long) As Long

Private Declare Function RegSetValueExStr Lib "advapi32" Alias "RegSetValueExA" _
  (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, _
  ByVal dwType As Long, ByVal szData As String, ByVal cbData As Long) As Long
Private Declare Function RegSetValueExLong Lib "advapi32" Alias "RegSetValueExA" _
  (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, _
  ByVal dwType As Long, szData As Long, ByVal cbData As Long) As Long
Private Declare Function RegSetValueExByte Lib "advapi32" Alias "RegSetValueExA" _
  (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, _
  ByVal dwType As Long, szData As Byte, ByVal cbData As Long) As Long

Private Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long

Private Declare Function RegQueryValueExStr Lib "advapi32" Alias "RegQueryValueExA" _
  (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, _
  ByRef lpType As Long, ByVal szData As String, ByRef lpcbData As Long) As Long
Private Declare Function RegQueryValueExLong Lib "advapi32" Alias "RegQueryValueExA" _
  (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, _
  ByRef lpType As Long, szData As Long, ByRef lpcbData As Long) As Long
Private Declare Function RegQueryValueExByte Lib "advapi32" Alias "RegQueryValueExA" _
  (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, _
  ByRef lpType As Long, szData As Byte, ByRef lpcbData As Long) As Long
 
Private Declare Function RegCreateKeyEx Lib "advapi32" Alias "RegCreateKeyExA" _
  (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, _
  ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, _
  lpSecurityAttributes As SECURITY_ATTRIBUTES, phkResult As Long, _
  lpdwDisposition As Long) As Long

Private Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias "RegEnumKeyExA" _
  (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, _
  lpcbName As Long, ByVal lpReserved As Long, ByVal lpClass As String, _
  lpcbClass As Long, lpftLastWriteTime As FILETIME) As Long

Private Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" ( _
    ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, _
    ByVal cbName As Long) As Long

Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" _
  (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, _
  lpcbValueName As Long, ByVal lpReserved As Long, ByVal lpType As Long, _
  ByVal lpData As Long, ByVal lpcbData As Long) As Long
 
Private Declare Function RegEnumValueLong Lib "advapi32.dll" Alias "RegEnumValueA" _
  (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, _
  lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, _
  lpData As Long, lpcbData As Long) As Long
Private Declare Function RegEnumValueStr Lib "advapi32.dll" Alias "RegEnumValueA" _
  (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, _
  lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, _
  ByVal lpData As String, lpcbData As Long) As Long
Private Declare Function RegEnumValueByte Lib "advapi32.dll" Alias "RegEnumValueA" _
  (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, _
  lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, _
  lpData As Byte, lpcbData As Long) As Long

Private Declare Function RegQueryInfoKey Lib "advapi32.dll" Alias "RegQueryInfoKeyA" _
  (ByVal hKey As Long, ByVal lpClass As String, _
  lpcbClass As Long, ByVal lpReserved As Long, lpcSubKeys As Long, _
  lpcbMaxSubKeyLen As Long, lpcbMaxClassLen As Long, lpcValues As Long, _
  lpcbMaxValueNameLen As Long, lpcbMaxValueLen As Long, lpcbSecurityDescriptor As Long, _
  lpftLastWriteTime As Any) As Long

Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" _
  (ByVal hKey As Long, ByVal lpSubKey As String) As Long

Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" _
  (ByVal hKey As Long, ByVal lpValueName As String) As Long

' Other declares:
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
    lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Private Declare Function ExpandEnvironmentStrings Lib "kernel32" Alias "ExpandEnvironmentStringsA" (ByVal lpSrc As String, ByVal lpDst As String, ByVal nSize As Long) As Long


Public Enum ERegistryClassConstants
    HKEY_CLASSES_ROOT = &H80000000
    HKEY_CURRENT_USER = &H80000001
    HKEY_LOCAL_MACHINE = &H80000002
    HKEY_USERS = &H80000003
End Enum

Public Enum ERegistryValueTypes
'Predefined Value Types
    REG_NONE = (0)                        'No value type
    REG_SZ = (1)                          'Unicode nul terminated string
    REG_EXPAND_SZ = (2)                    'Unicode nul terminated string w/enviornment var
    REG_BINARY = (3)                      'Free form binary
    REG_DWORD = (4)                        '32-bit number
    REG_DWORD_LITTLE_ENDIAN = (4)          '32-bit number (same as REG_DWORD)
    REG_DWORD_BIG_ENDIAN = (5)            '32-bit number
    REG_LINK = (6)                        'Symbolic Link (unicode)
    REG_MULTI_SZ = (7)                    'Multiple Unicode strings
    REG_RESOURCE_LIST = (8)                'Resource list in the resource map
    REG_FULL_RESOURCE_DESCRIPTOR = (9)    'Resource list in the hardware description
    REG_RESOURCE_REQUIREMENTS_LIST = (10)
End Enum

Private m_hClassKey As Long
Private m_sSectionKey As String
Private m_sValueKey As String
Private m_vValue As Variant
Private m_sSetValue As String
Private m_vDefault As Variant
Private m_eValueType As ERegistryValueTypes

Public Property Get KeyExists() As Boolean
    'KeyExists = bCheckKeyExists( _
    '                m_hClassKey, _
    '                m_sSectionKey _
    '            )
Dim hKey As Long
    If RegOpenKeyEx(m_hClassKey, m_sSectionKey, 0, 1, hKey) = ERROR_SUCCESS Then
        KeyExists = True
        RegCloseKey hKey
    Else
        KeyExists = False
    End If
   
End Property
Public Function CreateKey() As Boolean
Dim tSA As SECURITY_ATTRIBUTES
Dim hKey As Long
Dim lCreate As Long
Dim e As Long

    'Open or Create the key
    e = RegCreateKeyEx(m_hClassKey, m_sSectionKey, 0, "", REG_OPTION_NON_VOLATILE, _
                KEY_ALL_ACCESS, tSA, hKey, lCreate)
    If e Then
        Err.Raise 26001, App.EXEName & ".cRegistry", "Failed to create registry Key: '" & m_sSectionKey
    Else
        CreateKey = (e = ERROR_SUCCESS)
        'Close the key
        RegCloseKey hKey
    End If
End Function
Public Function DeleteKey() As Boolean
Dim e As Long
    e = RegDeleteKey(m_hClassKey, m_sSectionKey)
    If e Then
        Err.Raise 26001, App.EXEName & ".cRegistry", "Failed to delete registry Key: '" & m_hClassKey & "',Section: '" & m_sSectionKey
    Else
        DeleteKey = (e = ERROR_SUCCESS)
    End If
   
End Function
Public Function DeleteValue() As Boolean
Dim e As Long
Dim hKey As Long

    e = RegOpenKeyEx(m_hClassKey, m_sSectionKey, 0, KEY_ALL_ACCESS, hKey)
    If e Then
        Err.Raise 26001, App.EXEName & ".cRegistry", "Failed to open key '" & m_hClassKey & "',Section: '" & m_sSectionKey & "' for delete access"
    Else
        e = RegDeleteValue(hKey, m_sValueKey)
        If e Then
            Err.Raise 26001, App.EXEName & ".cRegistry", "Failed to delete registry Key: '" & m_hClassKey & "',Section: '" & m_sSectionKey & "',Key: '" & m_sValueKey
        Else
            DeleteValue = (e = ERROR_SUCCESS)
        End If
    End If

End Function
Public Property Get Value() As Variant
Dim vValue As Variant
Dim cData As Long, sData As String, ordType As Long, e As Long
Dim hKey As Long

    e = RegOpenKeyEx(m_hClassKey, m_sSectionKey, 0, KEY_QUERY_VALUE, hKey)
    'ApiRaiseIf e

    e = RegQueryValueExLong(hKey, m_sValueKey, 0&, ordType, 0&, cData)
    If e And e <> ERROR_MORE_DATA Then
        Value = m_vDefault
        Exit Property
    End If
   
    m_eValueType = ordType
    Select Case ordType
    Case REG_DWORD, REG_DWORD_LITTLE_ENDIAN
        Dim iData As Long
        e = RegQueryValueExLong(hKey, m_sValueKey, 0&, _
                              ordType, iData, cData)
        vValue = CLng(iData)
       
    Case REG_DWORD_BIG_ENDIAN  ' Unlikely, but you never know
        Dim dwData As Long
        e = RegQueryValueExLong(hKey, m_sValueKey, 0&, _
                              ordType, dwData, cData)
        vValue = SwapEndian(dwData)
       
    Case REG_SZ, REG_MULTI_SZ ' Same thing to Visual Basic
        sData = String$(cData - 1, 0)
        e = RegQueryValueExStr(hKey, m_sValueKey, 0&, _
                              ordType, sData, cData)
        vValue = sData
       
    Case REG_EXPAND_SZ
        sData = String$(cData - 1, 0)
        e = RegQueryValueExStr(hKey, m_sValueKey, 0&, _
                              ordType, sData, cData)
        vValue = ExpandEnvStr(sData)
       
    ' Catch REG_BINARY and anything else
    Case Else
        Dim abData() As Byte
        ReDim abData(cData)
        e = RegQueryValueExByte(hKey, m_sValueKey, 0&, _
                                ordType, abData(0), cData)
        vValue = abData
       
    End Select
    Value = vValue
   
End Property
Public Property Let Value( _
        ByVal vValue As Variant _
    )
Dim ordType As Long
Dim c As Long
Dim hKey As Long
Dim e As Long
Dim lCreate As Long
Dim tSA As SECURITY_ATTRIBUTES

    'Open or Create the key
    e = RegCreateKeyEx(m_hClassKey, m_sSectionKey, 0, "", REG_OPTION_NON_VOLATILE, _
                KEY_ALL_ACCESS, tSA, hKey, lCreate)
   
    If e Then
        Err.Raise 26001, App.EXEName & ".cRegistry", "Failed to set registry value Key: '" & m_hClassKey & "',Section: '" & m_sSectionKey & "',Key: '" & m_sValueKey & "' to value: '" & m_vValue & "'"
    Else

        Select Case m_eValueType
        Case REG_BINARY
            If (VarType(vValue) = vbArray + vbByte) Then
                Dim ab() As Byte
                ab = vValue
                ordType = REG_BINARY
                c = UBound(ab) - LBound(ab) - 1
                e = RegSetValueExByte(hKey, m_sValueKey, 0&, ordType, ab(0), c)
            Else
                Err.Raise 26001
            End If
        Case REG_DWORD, REG_DWORD_BIG_ENDIAN, REG_DWORD_LITTLE_ENDIAN
            If (VarType(vValue) = vbInteger) Or (VarType(vValue) = vbLong) Then
                Dim i As Long
                i = vValue
                ordType = REG_DWORD
                e = RegSetValueExLong(hKey, m_sValueKey, 0&, ordType, i, 4)
            End If
        Case REG_SZ, REG_EXPAND_SZ
            Dim s As String, iPos As Long
            s = vValue
            ordType = REG_SZ
            ' Assume anything with two non-adjacent percents is expanded string
            iPos = InStr(s, "%")
            If iPos Then
                If InStr(iPos + 2, s, "%") Then ordType = REG_EXPAND_SZ
            End If
            c = Len(s) + 1
            e = RegSetValueExStr(hKey, m_sValueKey, 0&, ordType, s, c)
           
        ' User should convert to a compatible type before calling
        Case Else
            e = ERROR_INVALID_DATA
           
        End Select
       
        If Not e Then
            m_vValue = vValue
        Else
            Err.Raise vbObjectError + 1048 + 26001, App.EXEName & ".cRegistry", "Failed to set registry value Key: '" & m_hClassKey & "',Section: '" & m_sSectionKey & "',Key: '" & m_sValueKey & "' to value: '" & m_vValue & "'"
        End If
       
        'Close the key
        RegCloseKey hKey
   
    End If
   
End Property
Public Function EnumerateValues( _
        ByRef sKeyNames() As String, _
        ByRef iKeyCount As Long _
    ) As Boolean
Dim lResult As Long
Dim hKey As Long
Dim sName As String
Dim lNameSize As Long
Dim sData As String
Dim lIndex As Long
Dim cJunk As Long
Dim cNameMax As Long
Dim ft As Currency
 
  ' Log "EnterEnumerateValues"

  iKeyCount = 0
  Erase sKeyNames()
   
  lIndex = 0
  lResult = RegOpenKeyEx(m_hClassKey, m_sSectionKey, 0, KEY_QUERY_VALUE, hKey)
  If (lResult = ERROR_SUCCESS) Then
      ' Log "OpenedKey:" & m_hClassKey & "," & m_sSectionKey
      lResult = RegQueryInfoKey(hKey, "", cJunk, 0, _
                              cJunk, cJunk, cJunk, cJunk, _
                              cNameMax, cJunk, cJunk, ft)
      Do While lResult = ERROR_SUCCESS
 
          'Set buffer space
          lNameSize = cNameMax + 1
          sName = String$(lNameSize, 0)
          If (lNameSize = 0) Then lNameSize = 1
         
          ' Log "Requesting Next Value"
       
          'Get value name:
          lResult = RegEnumValue(hKey, lIndex, sName, lNameSize, _
                                  0&, 0&, 0&, 0&)
          ' Log "RegEnumValue returned:" & lResult
          If (lResult = ERROR_SUCCESS) Then
     
                ' Although in theory you can also retrieve the actual
                ' value and type here, I found it always (ultimately) resulted in
                ' a GPF, on Win95 and NT.  Why?  Can anyone help?
     
              sName = Left$(sName, lNameSize)
              ' Log "Enumerated value:" & sName
               
              iKeyCount = iKeyCount + 1
              ReDim Preserve sKeyNames(1 To iKeyCount) As String
              sKeyNames(iKeyCount) = sName
          End If
          lIndex = lIndex + 1
      Loop
  End If
  If (hKey <> 0) Then
      RegCloseKey hKey
  End If

  ' Log "Exit Enumerate Values"
  EnumerateValues = True
  Exit Function
 
EnumerateValuesError:
  If (hKey <> 0) Then
      RegCloseKey hKey
  End If
  Err.Raise vbObjectError + 1048 + 26003, App.EXEName & ".cRegistry", Err.Description
  Exit Function

End Function
Public Function EnumerateSections( _
        ByRef sSect() As String, _
        ByRef iSectCount As Long _
    ) As Boolean
Dim lResult As Long
Dim hKey As Long
Dim dwReserved As Long
Dim szBuffer As String
Dim lBuffSize As Long
Dim lIndex As Long
Dim lType As Long
Dim sCompKey As String
Dim iPos As Long

On Error GoTo EnumerateSectionsError

  iSectCount = 0
  Erase sSect
'
  lIndex = 0

  lResult = RegOpenKeyEx(m_hClassKey, m_sSectionKey, 0, KEY_ENUMERATE_SUB_KEYS, hKey)
  Do While lResult = ERROR_SUCCESS
      'Set buffer space
      szBuffer = String$(255, 0)
      lBuffSize = Len(szBuffer)
     
      'Get next value
      lResult = RegEnumKey(hKey, lIndex, szBuffer, lBuffSize)
                           
      If (lResult = ERROR_SUCCESS) Then
          iSectCount = iSectCount + 1
          ReDim Preserve sSect(1 To iSectCount) As String
          iPos = InStr(szBuffer, Chr$(0))
          If (iPos > 0) Then
              sSect(iSectCount) = Left(szBuffer, iPos - 1)
          Else
              sSect(iSectCount) = Left(szBuffer, lBuffSize)
          End If
      End If
     
      lIndex = lIndex + 1
  Loop
  If (hKey <> 0) Then
      RegCloseKey hKey
  End If
  EnumerateSections = True
  Exit Function

EnumerateSectionsError:
  If (hKey <> 0) Then
      RegCloseKey hKey
  End If
  Err.Raise vbObjectError + 1048 + 26002, App.EXEName & ".cRegistry", Err.Description
  Exit Function
End Function
Private Sub pSetClassValue(ByVal sValue As String)
Dim sSection As String
  ClassKey = HKEY_CLASSES_ROOT
  Value = sValue
  sSection = SectionKey
  ClassKey = HKEY_LOCAL_MACHINE
  SectionKey = "SOFTWARE\Classes\" & sSection
  Value = sValue
  SectionKey = sSection
End Sub
Public Sub CreateEXEAssociation( _
        ByVal sExePath As String, _
        ByVal sClassName As String, _
        ByVal sClassDescription As String, _
        ByVal sAssociation As String, _
        Optional ByVal sOpenMenuText As String = "&Open", _
        Optional ByVal bSupportPrint As Boolean = False, _
        Optional ByVal sPrintMenuText As String = "&Print", _
        Optional ByVal bSupportNew As Boolean = False, _
        Optional ByVal sNewMenuText As String = "&New", _
        Optional ByVal bSupportInstall As Boolean = False, _
        Optional ByVal sInstallMenuText As String = "", _
        Optional ByVal lDefaultIconIndex As Long = -1 _
    )
  ' Check if path is wrapped in quotes:
  sExePath = Trim$(sExePath)
  If (Left$(sExePath, 1) <> """") Then
      sExePath = """" & sExePath
  End If
  If (Right$(sExePath, 1) <> """") Then
      sExePath = sExePath & """"
  End If
   
    ' Create the .File to Class association:
  SectionKey = "." & sAssociation
  ValueType = REG_SZ
  ValueKey = ""
  pSetClassValue sClassName
 
  ' Create the Class shell open command:
  SectionKey = sClassName
  pSetClassValue sClassDescription
 
  SectionKey = sClassName & "\shell\open"
  If (sOpenMenuText = "") Then sOpenMenuText = "&Open"
  ValueKey = ""
  pSetClassValue sOpenMenuText
  SectionKey = sClassName & "\shell\open\command"
  ValueKey = ""
  pSetClassValue sExePath & " ""%1"""
 
  If (bSupportPrint) Then
      SectionKey = sClassName & "\shell\print"
      If (sPrintMenuText = "") Then sPrintMenuText = "&Print"
      ValueKey = ""
      pSetClassValue sPrintMenuText
      SectionKey = sClassName & "\shell\print\command"
      ValueKey = ""
      pSetClassValue sExePath & " /p ""%1"""
  End If
 
  If (bSupportInstall) Then
      If (sInstallMenuText = "") Then
        sInstallMenuText = "&Install " & sAssociation
      End If
      SectionKey = sClassName & "\shell\add"
      ValueKey = ""
      pSetClassValue sInstallMenuText
      SectionKey = sClassName & "\shell\add\command"
      ValueKey = ""
      pSetClassValue sExePath & " /a ""%1"""
  End If
 
  If (bSupportNew) Then
      SectionKey = sClassName & "\shell\new"
      ValueKey = ""
      If (sNewMenuText = "") Then sNewMenuText = "&New"
      pSetClassValue sNewMenuText
      SectionKey = sClassName & "\shell\new\command"
      ValueKey = ""
      pSetClassValue sExePath & " /n ""%1"""
  End If
 
  If lDefaultIconIndex > -1 Then
      SectionKey = sClassName & "\DefaultIcon"
      ValueKey = ""
      pSetClassValue sExePath & "," & CStr(lDefaultIconIndex)
  End If
   
End Sub
Public Sub CreateAdditionalEXEAssociations( _
      ByVal sClassName As String, _
      ParamArray vItems() As Variant _
  )
Dim iItems As Long
Dim iItem As Long
 
  On Error Resume Next
  iItems = UBound(vItems) + 1
  If (iItems Mod 3) <> 0 Or (Err.Number <> 0) Then
      Err.Raise vbObjectError + 1048 + 26004, App.EXEName & ".cRegistry", "Invalid parameter list passed to CreateAdditionalEXEAssociations - expected Name/Text/Command"
  Else
      ' Check if it exists:
      SectionKey = sClassName
      If Not (KeyExists) Then
        Err.Raise vbObjectError + 1048 + 26005, App.EXEName & ".cRegistry", "Error - attempt to create additional associations before class defined."
      Else
        For iItem = 0 To iItems - 1 Step 3
            ValueType = REG_SZ
            SectionKey = sClassName & "\shell\" & vItems(iItem)
            ValueKey = ""
            pSetClassValue vItems(iItem + 1)
            SectionKey = sClassName & "\shell\" & vItems(iItem) & "\command"
            ValueKey = ""
            pSetClassValue vItems(iItem + 2)
        Next iItem
      End If
  End If
 
End Sub
Public Property Get ValueType() As ERegistryValueTypes
    ValueType = m_eValueType
End Property
Public Property Let ValueType(ByVal eValueType As ERegistryValueTypes)
    m_eValueType = eValueType
End Property
Public Property Get ClassKey() As ERegistryClassConstants
    ClassKey = m_hClassKey
End Property
Public Property Let ClassKey( _
        ByVal eKey As ERegistryClassConstants _
    )
    m_hClassKey = eKey
End Property
Public Property Get SectionKey() As String
    SectionKey = m_sSectionKey
End Property
Public Property Let SectionKey( _
        ByVal sSectionKey As String _
    )
    m_sSectionKey = sSectionKey
End Property
Public Property Get ValueKey() As String
    ValueKey = m_sValueKey
End Property
Public Property Let ValueKey( _
        ByVal sValueKey As String _
    )
    m_sValueKey = sValueKey
End Property
Public Property Get Default() As Variant
    Default = m_vDefault
End Property
Public Property Let Default( _
        ByVal vDefault As Variant _
    )
    m_vDefault = vDefault
End Property
Private Function SwapEndian(ByVal dw As Long) As Long
    CopyMemory ByVal VarPtr(SwapEndian) + 3, dw, 1
    CopyMemory ByVal VarPtr(SwapEndian) + 2, ByVal VarPtr(dw) + 1, 1
    CopyMemory ByVal VarPtr(SwapEndian) + 1, ByVal VarPtr(dw) + 2, 1
    CopyMemory SwapEndian, ByVal VarPtr(dw) + 3, 1
End Function
Private Function ExpandEnvStr(sData As String) As String
    Dim c As Long, s As String
    ' Get the length
    s = "" ' Needed to get around Windows 95 limitation
    c = ExpandEnvironmentStrings(sData, s, c)
    ' Expand the string
    s = String$(c - 1, 0)
    c = ExpandEnvironmentStrings(sData, s, c)
    ExpandEnvStr = s
End Function

*****************************************************************

Denne kode:
Dim c As New cRegistry
With c
    .ClassKey = HKEY_CURRENT_USER
    .SectionKey = "Software\Microsoft\Internet Explorer"
    .ValueKey = "Download Directory"
    .ValueType = REG_SZ
    .Value = "c:\temp"
End With

Ændrer download folder til c:\temp.

//akj
Avatar billede cromwell Nybegynder
02. juli 2003 - 11:46 #13
Tak for svarene dk_akj og sjh, nu virker det som det skal:D
Var lidt i tvivl om hvordan jeg skulle fordele pointene mellem jer, så i har fået 100 hver:D
Avatar billede dk_akj Nybegynder
02. juli 2003 - 12:00 #14
Det er helt iorden med mig, bare dit program virker :-)

//akj
Avatar billede sjh Nybegynder
03. juli 2003 - 00:27 #15
Ja bare det virker, så kan alle være tilfreds :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester