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