Как записать данные в мой EXE

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Alex_new_2030
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 20.02.2003 (Чт) 8:00
Откуда: Kazakhstan

Как записать данные в мой EXE

Сообщение Alex_new_2030 » 04.04.2003 (Пт) 23:34

Как можно хранить данные программы (ну типа ini) в самой программе т.е. EXE файле?

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 05.04.2003 (Сб) 3:36

А, че? Меня тоже эта идея заинтриговала.
Вот за пару часиков и накатал
программку.

Берите, и пользуйтесь.

PS. Перед первым запуском обязательно компильнуть.
Лень было втавлять обработчики ошибок.


Option Explicit

' На форме создать текстовое окно,
' и кнопку !!!


' InitData - ключ (8 символов), указывающий на наши данные
' Дальше - непосредственно данные.
' В файле символы располагаются через 1 байт.

Const InitData = "InitDataCopyright (C) by Aula Igor. E-mail:aula@ghost.dn.ua"
Const KeyLen = 8

' Длина наших
Dim DataLen As Integer

Dim MyAppName As String ' Имя нашей проги

' Номер байта, с которого
' начинаются наши данные
Dim StartPoint As Long

' Тип записи
Private Type Record
MyData As Byte
End Type

Dim MyRecord As Record

Private Sub Form_Load()
' Текст ключа
Dim KeyDataString As String
' То-же, в НЕХ формате
Dim HexKeyDataString As String
' Текст наших данных
Dim DataString As String

Dim HexChar As String

Dim i As Long

MyAppName = App.Path & "\" & App.EXEName & ".exe"
Text1.Text = MyAppName

' Переводим наш ключ в НЕХ формат

For i = 1 To KeyLen ' По длине ключа
HexChar = Hex(Asc(Mid(InitData, i, 1)))
If Len(HexChar) = 1 Then HexChar = "0" + HexChar
HexKeyDataString = HexKeyDataString + HexChar
Next i

' Открываем файл
Open MyAppName For Random As #1 Len = Len(MyRecord)

' Упорно ищем ключ
KeyDataString = ""

StartPoint = 1
While StartPoint < FileLen(MyAppName) - Len(InitData) - 1
For i = StartPoint To StartPoint + KeyLen * 2 - 2 Step 2
Get #1, i, MyRecord
HexChar = Hex(MyRecord.MyData)
If Len(HexChar) = 1 Then HexChar = "0" + HexChar
KeyDataString = KeyDataString + HexChar
Next i
' Ключ найден?
If KeyDataString = HexKeyDataString Then GoTo StartPointFind
StartPoint = StartPoint + 1
KeyDataString = ""
Wend
StartPointFind:

' Пропустим ключ и прочитаем данные
StartPoint = StartPoint + KeyLen * 2

' Считываем наши данные
DataString = ""
DataLen = Len(Right(InitData, Len(InitData) - KeyLen))
For i = StartPoint To StartPoint + DataLen * 2 - 2 Step 2
Get #1, i, MyRecord
DataString = DataString + Chr(MyRecord.MyData)
Next i

Text1.Text = DataString
Close #1
End Sub

Private Sub Command1_Click()
Dim SaveInitData As String
Dim i As Integer
Dim Sp As Long
' Пишем в ехе-шник новые данные
' Открываем файл
SaveInitData = Text1.Text
' Нельзя превысить длину
' исходных данных, рухнет ехе-шник !!!
If Len(SaveInitData) > DataLen Then SaveInitData = Left(SaveInitData, DataLen)

' Если текст короткий,
' дополним пробелами
AddSpace:
If Len(SaveInitData) < DataLen Then
SaveInitData = SaveInitData + " "
GoTo AddSpace
End If

Open MyAppName For Random As #1 Len = Len(MyRecord)
' Пишем данные
Sp = StartPoint
For i = 1 To DataLen
MyRecord.MyData = Asc(Mid(SaveInitData, i, 1))
Put #1, Sp, MyRecord
Sp = Sp + 2
Next i
Close #1
End Sub

goro
Постоялец
Постоялец
 
Сообщения: 494
Зарегистрирован: 03.12.2002 (Вт) 11:45
Откуда: Украина, Запорожье

Сообщение goro » 05.04.2003 (Сб) 19:28

Что-то не работает твой пример. При нажатии на кнопку выдает ошибку 75: Path/File acces error.
ПРЕВЕД

Trojan Lord
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 05.04.2003 (Сб) 19:07

Сообщение Trojan Lord » 05.04.2003 (Сб) 19:36

Open MyAppName For Random As #1 Len = Len(MyRecord)
||
Open MyAppName For Binary As #1 Len = Len(MyRecord)

goro
Постоялец
Постоялец
 
Сообщения: 494
Зарегистрирован: 03.12.2002 (Вт) 11:45
Откуда: Украина, Запорожье

Сообщение goro » 05.04.2003 (Сб) 21:42

Trojan Lord писал(а):Open MyAppName For Random As #1 Len = Len(MyRecord)
||
Open MyAppName For Binary As #1 Len = Len(MyRecord)

Все равно тоже самое :(
ПРЕВЕД

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 06.04.2003 (Вс) 0:34

I'm Sorry.

Писал ночью, старый балбес - это я про себя, и не удосужился детально проверить. Уже который раз натыкаюсь на такую фишку, что из под VB работает, а в EXE - нет.
Проблема в том, что винда не дает возможности записывать файл, из которого был запущен процесс. Как эту функцию обрубить не знаю. Пытають сделать обходным путем.

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 06.04.2003 (Вс) 4:39

Все мужики, проблема разрешена!

Логика:
1. При запуске проги проверяется длина командной строки
если она пуста (запущен родитель), то на диске создается
копия файла.
2. Запускается копия с передачей в качестве параметра имени программы-родителя, а родитель завершается.
3. Копия знает из какого файла была запущена и при необходимости (нажатии кнопки) изменяет его.

Метод может и не совсем хорош, но Проверено! Работает!
Недостатоки:
1. На диске остается копия, которую надо удалять
2. Без VC++ не обошлось, пришлось на нем писать ОСХ

Исправленная программа ниже, исходник ОСХ для всех желающих по мылу.

Option Explicit

' На форме создать текстовое окно,
' и кнопку !!!


' InitData - ключ (8 символов), указывающий на наши данные
' Дальше - непосредственно данные.
' В файле символы располагаются через 1 байт.

Const InitData = "InitDataCopyright (C) by Aula Igor. E-mail:aula@ghost.dn.ua"
Const KeyLen = 8

' Длина наших
Dim DataLen As Integer

Dim MyAppName As String ' Имя нашей проги
Dim TmpAppName As String

' Номер байта, с которого
' начинаются наши данные
Dim StartPoint As Long

' Тип записи
Private Type Record
MyData As Byte
End Type

Dim MyRecord As Record


Private Sub Form_Load()
' Текст ключа
Dim KeyDataString As String
' То-же, в НЕХ формате
Dim HexKeyDataString As String
' Текст наших данных
Dim DataString As String

Dim HexChar As String

Dim i As Long

Dim a As Double


If Len(Command()) = 0 Then ' Командная строка пуста?

TmpAppName = App.Path & "\" & App.EXEName & "Tmp.exe"
MyAppName = App.Path & "\" & App.EXEName & ".exe"

Open MyAppName For Binary As #1
Open TmpAppName For Random As #2 Len = Len(MyRecord)
i = 1
While i <= LOF(1)
MyRecord.MyData = Asc(Input(1, #1))
Put #2, i, MyRecord.MyData
i = i + 1
Wend
Close #1
Close #2
' Это через ОСХ !!! Аналог - API функция 'CreateProcess'
Security.RunProcess (App.EXEName & "Tmp.exe" & " " & MyAppName)
End
End If

' Имя программы-родителя
MyAppName = Command()

' Переводим наш ключ в НЕХ формат

For i = 1 To KeyLen ' По длине ключа
HexChar = Hex(Asc(Mid(InitData, i, 1)))
If Len(HexChar) = 1 Then HexChar = "0" + HexChar
HexKeyDataString = HexKeyDataString + HexChar
Next i

' Открываем файл
Open MyAppName For Random As #1 Len = Len(MyRecord)

' Упорно ищем ключ
KeyDataString = ""

StartPoint = 1
While StartPoint < FileLen(MyAppName) - Len(InitData) - 1
For i = StartPoint To StartPoint + KeyLen * 2 - 2 Step 2
Get #1, i, MyRecord
HexChar = Hex(MyRecord.MyData)
If Len(HexChar) = 1 Then HexChar = "0" + HexChar
KeyDataString = KeyDataString + HexChar
Next i
' Ключ найден?
If KeyDataString = HexKeyDataString Then GoTo StartPointFind
StartPoint = StartPoint + 1
KeyDataString = ""
Wend
StartPointFind:

' Пропустим ключ и прочитаем данные
StartPoint = StartPoint + KeyLen * 2

' Считываем наши данные
DataString = ""
DataLen = Len(Right(InitData, Len(InitData) - KeyLen))
For i = StartPoint To StartPoint + DataLen * 2 - 2 Step 2
Get #1, i, MyRecord
DataString = DataString + Chr(MyRecord.MyData)
Next i

Text1.Text = DataString
Close #1
End Sub

Private Sub Command1_Click()
Dim SaveInitData As String
Dim i As Integer
Dim Sp As Long
' Пишем в ехе-шник новые данные
' Открываем файл
SaveInitData = Text1.Text
' Нельзя превысить длину
' исходных данных, рухнет ехе-шник !!!
If Len(SaveInitData) > DataLen Then SaveInitData = Left(SaveInitData, DataLen)

' Если текст короткий,
' дополним пробелами
AddSpace:
If Len(SaveInitData) < DataLen Then
SaveInitData = SaveInitData + " "
GoTo AddSpace
End If


Open MyAppName For Random As #1 Len = Len(MyRecord)
' Пишем данные
Sp = StartPoint
For i = 1 To DataLen
MyRecord.MyData = Asc(Mid(SaveInitData, i, 1))
Put #1, Sp, MyRecord
Sp = Sp + 2
Next i
Close #1
End Sub


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing-бот, Google-бот и гости: 50

    TopList