Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Свой собственный формат при сохранении файла Добавлено: 20.07.06 15:24  

Автор вопроса:  -АлександР- | Web-сайт: sham.clan.su
Кто что-нибудь слышал про возможность сохранять файлы со своим собственном расширением в VB-приожениях, отзовитесь!

Ответить

  Ответы Всего ответов: 15  

Номер ответа: 1
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #1 Добавлено: 20.07.06 15:30
Сам понял че спросил?

Ответить

Номер ответа: 2
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #2
Добавлено: 20.07.06 15:53
Понял, но не знаю, как это объяснить.
Объясню подробнее:
Вобщем,написал прогу, в которой Line-ами создал рисунок. Нужно этот рисунок сохранить, но не как bmp, ico, jpeg и т. п. Нужно, чтобы при открытии этого рисунка через мою прогу, можно было работать с этим рисунком.
Ну короче, типа .dwg

Ответить

Номер ответа: 3
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #3 Добавлено: 20.07.06 16:04
Сохранить ты его можешь под любым расширением, это никак не отразится на работе с этим файлом. Возможно ты имел ввиду присвоить своему расширению иконку и сдлеть чтобы по двойному клику этот запускалась твоя программа и открывала этот файл? Так таких примеров тут уйма, зайди в поиск или в примеры.

Ответить

Номер ответа: 4
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #4
Добавлено: 20.07.06 16:22

сдлеть чтобы по двойному клику этот запускалась твоя программа и открывала этот файл

Именно это. Спасибо, поищу.

Ответить

Номер ответа: 5
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #5
Добавлено: 20.07.06 16:47
Но был бы весьма благодарен, если кто ссылку подскажет, а то не знаю с чего начать

Ответить

Номер ответа: 6
Автор ответа:
 Softer



ICQ: 203660381  

Вопросов: 29
Ответов: 205
 Web-сайт: hware.org.ua
 Профиль | | #6
Добавлено: 20.07.06 17:11
Если все дело только в том чтоб на двойном клике запускалась твоя прога, то вроде так-
В Form_Load:
FileName=command$

Гдето вне:
dim FileName as string

или
public FileName as string

Соответственно в FileName будет имя файла. В реестре прописываешь open на твой тип вида PROGRAM.EXE %1 и наслаждаешься... :)

ЗЫ: Надеюсь не очень запутанно? :)

Ответить

Номер ответа: 7
Автор ответа:
 [root]



Вопросов: 45
Ответов: 1212
 Web-сайт: bit.pirit.info
 Профиль | | #7
Добавлено: 20.07.06 17:29
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)


Ответить

Номер ответа: 8
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #8
Добавлено: 20.07.06 20:03
Спасибо, [root]!

Ответить

Номер ответа: 9
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #9
Добавлено: 20.07.06 20:36
И снова я!
Когда я пишу этот код, то он выдаёт, что константа HKEY_CLASSES_ROOT не определена:

tmpStr = GetKeyValue(HKEY_CLASSES_ROOT, FileExt, "";)

То же самое он пишет про GetKeyValue: функция не опредлена. Ну никак он её не чувствует как внутреннюю...
Может надо подключить какую-то библиотеку? Или я чего-то не так делаю?


В реестре прописываешь open на твой тип вида PROGRAM.EXE %1 и наслаждаешься... :)

ЗЫ: Надеюсь не очень запутанно? :)

Да нет, наоборот просто.
Вот только можно чуть-чуть подробнее про реестр...

Ответить

Номер ответа: 10
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #10 Добавлено: 20.07.06 22:47
открой API Text Viewer, в комплекте с VS6 идёт...

Ответить

Номер ответа: 11
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #11
Добавлено: 21.07.06 00:00

Я бы рад, да не всё так просто, там нет функции GetKeyValue, впрочем по крайней мере её нет у меня на VB6.
Поправь меня, если я ошибаюсь. Может это на твоём VS6 есть. Хотя я сомневаюсь.:)

Проблема в другом - нужно подключить библиотеку
…\Program Files\Microsoft Visual Studio\Common\Tools\APE\REGTOOL5.DLL

Она то у меня и отсутствует, потому что диск пиратский;

Скиньте кто-нибудь, please, на e-mail! У кого весь VB в комплекте. Она весит мелочь.

Ответить

Номер ответа: 12
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #12 Добавлено: 21.07.06 01:03
хм ну 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)
'    ;Dim 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


Нужная тебе ф-ция - RegGetValue

Ответить

Номер ответа: 13
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #13
Добавлено: 21.07.06 01:16
Ну ты даёшь! ALIGN = CENTER
Спасибо тебе большое!


Такое же большое, как весь этот код.

И такое же большое, как моя работа в том, чтобы во всём этом разобраться...

Ответить

Номер ответа: 14
Автор ответа:
 [root]



Вопросов: 45
Ответов: 1212
 Web-сайт: bit.pirit.info
 Профиль | | #14
Добавлено: 21.07.06 05:12
Товарисч Hacker все гораздо проще, я знаю что не так давно видел
статью у себя на винте и решил выложить ее в топик, авось аффтар,
включит мозг и поиск, а так же ребята помогут.

PS No comment $-)

Ответить

Номер ответа: 15
Автор ответа:
 [root]



Вопросов: 45
Ответов: 1212
 Web-сайт: bit.pirit.info
 Профиль | | #15
Добавлено: 21.07.06 05:18
Сорри за оффтоп
Hacker не все гонятся за "+"
Как это делаешь ты, мен много раз помогали на форуме, и так же вне
форума, но люди с кем я познакомился тут.
Так что я не считаю проблемой дать код и помочь человеку.
А еще считаю, не фиг разводить базары, как почти всегда бывает, когда
просто можно сунуть код - нет, не законченный, а просто навести на
мысль.
А же не буду за аффтара решать его проблему, а навести на мысль почему
нет, вот код и подкинул. Понять, что тут апишки я думаю не проблема,
вьювер включил поиск и опа вот те декларация.
PS гуд, лето, наверное просто у всех мозги плавятся

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам