Понял, но не знаю, как это объяснить.
Объясню подробнее:
Вобщем,написал прогу, в которой Line-ами создал рисунок. Нужно этот рисунок сохранить, но не как bmp, ico, jpeg и т. п. Нужно, чтобы при открытии этого рисунка через мою прогу, можно было работать с этим рисунком.
Ну короче, типа .dwg
Сохранить ты его можешь под любым расширением, это никак не отразится на работе с этим файлом. Возможно ты имел ввиду присвоить своему расширению иконку и сдлеть чтобы по двойному клику этот запускалась твоя программа и открывала этот файл? Так таких примеров тут уйма, зайди в поиск или в примеры.
1. "Крутейшая" программа должна обрабатывать командную строку,
а именно брать оттуда путь и имя этого файла...
2. Смотрим, а не висит ли уже кто-либо на этом типе файлов....
Раздел [HKEY_CLASSES_ROOT\.ext], параметр [по умолчанию]
Пример: tmpStr = GetKeyValue(HKEY_CLASSES_ROOT, FileExt, ""
(Здесь FileExt - строковая константа, см. полный пример...)
Если никого нет, то tmpStr будет равно "".
3. Если никого нет, то создаем свой раздел DefaultReg, если кто-то уже
прицепился, то добавляем в его раздел (то есть в tmpStr).
Далее смотри код примера... Я даже комментариев понаписал...
(сколько смог...)
Полный пример (VB Код):
'Комментарии излишни по-моему...
Private FullPathAndFileName As String
Private CmdLine As String
'Определяет делать ли вообще то о чем идет речь...
Private Const UpdReg As Boolean = True
'Определяет ставить наше действие "по умолчанию" или нет...
Private Const UpdDefault As Boolean = True
'Расширение на которое подвешиваем свою программу...
Private Const FileExt As String = ".rom"
'Имя своего раздела в реестре если на этом типе файлов еще никто не висит...
'(само имя ни на что не влияет)
Private Const DefaultReg As String = "ROMfile"
'Действие, которое будем делать над файлом
Private Const DefaultAct As String = "Convert"
'Название действия, которое будем делать над файлом
'(Проводник именно эту надпись выведет по правой кнопке)
Private Const DefaultActName As String = "Преобразовать"
'Описание файлов с таким расширением...
Private Const ExtDescription As String = "Asm Output file"
'Я это ставлю на Form_Load....
Private Sub Form_Load()
Dim tmpStr As String
'Определяем свой путь и имя файла
FullPathAndFileName = App.Path
If Right(App.Path,1) <> "\" Then FullPathAndFileName = FullPathAndFileName & "\"
FullPathAndFileName = FullPathAndFileName & App.EXEName & ".exe %1"
If UpdReg Then'А надо ли в реестр-то писать? [const]
'Считываем на предмет "висит" ли кто на этом типе файлов...
tmpStr = GetKeyValue(HKEY_CLASSES_ROOT, FileExt, ""
If tmpStr = "" Then'Если никто не висит...
tmpStr = DefaultReg
'Делаем свою запись на это расширение
UpdateKey HKEY_CLASSES_ROOT, FileExt, "", tmpStr
'Присобачиваем свое описание таких файлов...
UpdateKey HKEY_CLASSES_ROOT, tmpStr, "", ExtDescription
End If
If UpdDefault Then
'Ставим свое действие "по умолчанию"
UpdateKey HKEY_CLASSES_ROOT, tmpStr & "\shell", "", DefaultAct
End If
'Прописываем название действия
UpdateKey HKEY_CLASSES_ROOT, tmpStr & "\shell\" & DefaultAct, "", DefaultActName
'Прописываем пути и имя нашей программы....
UpdateKey HKEY_CLASSES_ROOT, tmpStr & "\shell\" & DefaultAct & "\command", "", FullPathAndFileName
End If
'И пошла командная строка...
CmdLine = Command
CmdLine = Trim(CmdLine)
То же самое он пишет про GetKeyValue: функция не опредлена. Ну никак он её не чувствует как внутреннюю...
Может надо подключить какую-то библиотеку? Или я чего-то не так делаю?
В реестре прописываешь open на твой тип вида PROGRAM.EXE %1 и наслаждаешься...
ЗЫ: Надеюсь не очень запутанно?
Да нет, наоборот просто.
Вот только можно чуть-чуть подробнее про реестр...
Я бы рад, да не всё так просто, там нет функции GetKeyValue, впрочем по крайней мере её нет у меня на VB6.
Поправь меня, если я ошибаюсь. Может это на твоём VS6 есть. Хотя я сомневаюсь.
хм ну GetKeyValue, как и UpdateKey, куда ж мне до root'a он все декларации на изусть знает и считает что нет смысла приводить их декларацию
А как было на самом деле:
root знает, что это называется ассоциация приложения, так вот 5-ти секундный поиск по ключевому слову, ещё 3 сек что-то копировать/вставить первый попавшийся кусок кода который нашёлся в поиске - всё +1 ответ на форуме.
А теперь, о том как надо читать данные из реестра:
[модуль]
Option Explicit
Public Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dwReserved As Long, ByVal samDesired As Long, phkResult As Long) As Long
Public Declare Function RegCreateKey Lib "ADVAPI32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Public Declare Function RegCloseKey& Lib "advapi32" (ByVal hKey As Long)
Public Declare Function RegQueryValueEx Lib "advapi32" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
Public 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
Public Declare Function RegSetValueEx Lib "ADVAPI32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Public 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 Any) As Long
Public 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, lpType As Long, lpData As Any, lpcbData As Long) As Long
Public Declare Function RegDeleteKey Lib "ADVAPI32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long
Public Declare Function RegDeleteValue Lib "ADVAPI32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
Private Const KEY_ALL_ACCESS As Long = ((&H1F0000 Or &H1 Or &H2 Or &H4 Or &H8 Or &H10 Or &H20) And (Not &H100000))
Private Const REG_SZ As Long = &H1
Private Const REG_DWORD As Long = &H4
Private Const ERROR_SUCCESS As Long = &H0
Public Enum RootKey
HKEY_CLASSES_ROOT = &H80000000
HKEY_CURRENT_USER = &H80000001
HKEY_LOCAL_MACHINE = &H80000002
HKEY_USERS = &H80000003
End Enum
Public Function RegGetValue(hKey As RootKey, strSubKey As String, strValueName As String) As String
Dim lngDataLen As Long, hSubKey As Long, strSetting As String
If RegOpenKeyEx(hKey, strSubKey, 0, KEY_ALL_ACCESS, hSubKey) = ERROR_SUCCESS Then
strSetting = Space(255): lngDataLen = Len(strSetting)
If RegQueryValueEx(hSubKey, strValueName, ByVal 0, REG_SZ, ByVal strSetting, lngDataLen) = ERROR_SUCCESS Then
If lngDataLen > 1 Then RegGetValue = Left(strSetting, lngDataLen - 1)
End If
RegCloseKey hSubKey
End If
End Function
Public Sub RegSetValue(hKey As RootKey, strSubKey As String, strKey As String, strValue As String)
Dim keyhand As Long
Call Trim(strKey): Call Trim(strValue) 'Убираем пробелы в нач. и кон. строки
If Len(strKey) = 0 Or Len(strValue) = 0 Then Exit Sub
Call RegCreateKey(hKey, strSubKey, keyhand)
Call RegSetValueEx(keyhand, strKey, 0, 1&, ByVal strValue, Len(strValue) + 1)
Call RegCloseKey(keyhand)
End Sub
Public Sub RegSetKey(hKey As RootKey, strSubKey As String)
Dim keyhand As Long
RegCreateKey hKey, strSubKey, keyhand
RegCloseKey keyhand
End Sub
Public Function RegGetDWord(hKey As RootKey, strSubKey As String, strValueName As String) As Long
Dim hSubKey As Long, lngRetVal As Long
If RegOpenKeyEx(hKey, strSubKey, 0, KEY_ALL_ACCESS, hSubKey) = ERROR_SUCCESS Then
If RegQueryValueEx(hSubKey, strValueName, ByVal 0, REG_DWORD, lngRetVal, 4) = ERROR_SUCCESS Then RegGetDWord = lngRetVal
RegCloseKey hSubKey
End If
End Function
Public Sub RegSetDWord(hKey As RootKey, strSubKey As String, strValueName As String, lngData As Long)
Dim hNewHandle As Long
RegCreateKey hKey, strSubKey, hNewHandle
RegSetValueEx hNewHandle, strValueName, 0, REG_DWORD, lngData, 4
RegCloseKey hNewHandle
End Sub
Public Function RegGetKeys(hKey As RootKey, strSubKey As String, strRetArray() As String, Optional Range As Long) As Long
Dim hChildKey As Long, lngSubKeys As Long, lngMaxKeySize As Long, lngDataRetBytes As Long, i As Integer
If Len(strSubKey) Then
If RegOpenKeyEx(hKey, strSubKey, 0, KEY_ALL_ACCESS, hChildKey) <> ERROR_SUCCESS Then Range = -1: Erase strRetArray: Exit Function
Else
hChildKey = hKey
End If
If QueryRegInfoKey(hChildKey, lngSubKeys, lngMaxKeySize) <> ERROR_SUCCESS Or lngSubKeys = 0 Then
If Len(strSubKey) Then RegCloseKey hChildKey
Range = -1
Erase strRetArray
Exit Function
End If
lngSubKeys = lngSubKeys - 1
ReDim strRetArray(lngSubKeys) As String
For i = 0 To lngSubKeys
lngDataRetBytes = lngMaxKeySize
strRetArray(i) = Space(lngMaxKeySize)
RegEnumKeyEx hChildKey, i, strRetArray(i), lngDataRetBytes, 0&, vbNullString, ByVal 0&, ByVal 0&
strRetArray(i) = Left(strRetArray(i), lngDataRetBytes)
Next i
If Len(strSubKey) Then RegCloseKey hChildKey
Range = lngSubKeys
RegGetKeys = lngSubKeys
End Function
Public Function RegGetKeyValues(hKey As RootKey, strSubKey As String, strValues() As String, Optional Range As Long) As Long
Dim lngMaxValSize As Long, lngValRetBytes As Long, lngMaxSettingSize As Long, lngSetRetBytes As Long
Dim lngSetting As Long, lngType As Long, hChildKey As Long, i As Integer, lngNumValues As Long
If RegOpenKeyEx(hKey, strSubKey, 0, KEY_ALL_ACCESS, hChildKey) <> ERROR_SUCCESS Then Range = -1: Erase strValues: Exit Function
If QueryRegInfoKey(hChildKey, , , lngNumValues, lngMaxValSize, lngMaxSettingSize) <> ERROR_SUCCESS Or lngNumValues = 0 Then RegCloseKey hChildKey: Erase strValues: Exit Function
lngNumValues = lngNumValues - 1
ReDim strValues(0 To lngNumValues, 0 To 1) As String
For i = 0 To lngNumValues
strValues(i, 0) = Space(lngMaxValSize): lngValRetBytes = lngMaxValSize: strValues(i, 1) = Space(lngMaxSettingSize)
lngSetRetBytes = lngMaxSettingSize
RegEnumValue hChildKey, i, strValues(i, 0), lngValRetBytes, 0, lngType, ByVal strValues(i, 1), lngSetRetBytes
If lngType = REG_SZ Then
strValues(i, 1) = Left(strValues(i, 1), lngSetRetBytes - 1)
ElseIf lngType = REG_DWORD Then
lngValRetBytes = lngValRetBytes + 1
RegEnumValue hChildKey, i, strValues(i, 0), _
lngValRetBytes, 0, lngType, lngSetting, lngSetRetBytes
strValues(i, 1) = CStr(lngSetting)
Else
strValues(i, 1) = vbNullString
End If
strValues(i, 0) = RTrim(Left(strValues(i, 0), lngValRetBytes))
strValues(i, 1) = RTrim(strValues(i, 1))
Next i
RegCloseKey hChildKey
Range = lngNumValues
RegGetKeyValues = lngNumValues
End Function
Private Function QueryRegInfoKey(hKey As RootKey, Optional lngSubKeys As Long, Optional lngMaxKeyLen As Long, Optional lngValues As Long, Optional lngMaxValNameLen As Long, Optional lngMaxValLen As Long)
QueryRegInfoKey = RegQueryInfoKey(hKey, vbNullString, ByVal 0&, 0&, lngSubKeys, lngMaxKeyLen, ByVal 0&, lngValues, lngMaxValNameLen, lngMaxValLen, ByVal 0&, ByVal 0&
lngMaxKeyLen = lngMaxKeyLen + 1
lngMaxValNameLen = lngMaxValNameLen + 1
lngMaxValLen = lngMaxValLen + 1
End Function
Public Sub RegDelKey(hKey As RootKey, strKeyToDel As String)
RegDeleteKey hKey, strKeyToDel
End Sub
Public Sub RegDelValue(hKey As RootKey, strSubKey As String, strValToDel As String)
Dim hSubKey As Long
RegOpenKeyEx hKey, strSubKey, 0, KEY_ALL_ACCESS, hSubKey
RegDeleteValue hSubKey, strValToDel
RegCloseKey hSubKey
End Sub
'Копирование стринговых значений из 1-го ключа в другой
'Public Sub CopyKeyVal(hKey As RootKey, sFrom As String, sTo As String)
'  im sArray() As String, ii As Long
' Call RegGetKeyValues(HKEY_LOCAL_MACHINE, sFrom, sArray)
' For ii = 0 To UBoundS(sArray)
' Call RegSetValue(HKEY_LOCAL_MACHINE, sTo, sArray(ii, 0), sArray(ii, 1))
' Next
'End Sub
Товарисч Hacker все гораздо проще, я знаю что не так давно видел
статью у себя на винте и решил выложить ее в топик, авось аффтар,
включит мозг и поиск, а так же ребята помогут.
Сорри за оффтоп
Hacker не все гонятся за "+"
Как это делаешь ты, мен много раз помогали на форуме, и так же вне
форума, но люди с кем я познакомился тут.
Так что я не считаю проблемой дать код и помочь человеку.
А еще считаю, не фиг разводить базары, как почти всегда бывает, когда
просто можно сунуть код - нет, не законченный, а просто навести на
мысль.
А же не буду за аффтара решать его проблему, а навести на мысль почему
нет, вот код и подкинул. Понять, что тут апишки я думаю не проблема,
вьювер включил поиск и опа вот те декларация.
PS гуд, лето, наверное просто у всех мозги плавятся