Можно ли обменяться значениями между EXE файлами - VB

Узнай цену своей работы

Формулировка задачи:

Вопрос у меня такой, я хочу изготовить

exe

-шник который бы принимал тот или иной параметр из командной строки и так-же мог передавать параметр по окончанию выполнения в командную строку как это сделать ?, и можно ли это сделать ? Конечно, я уже рассматривал такой вариант чтоб обмениваться параметрами в реестре но мне нужно сделать так чтоб

exe

-шник можно было запустить одной командной линией ...

Решение задачи: «Можно ли обменяться значениями между EXE файлами»

textual
Листинг программы
  1. Option Explicit
  2. DefLng F, I, L, N: DefStr J, S
  3. '
  4. '    © FelixMacintosh 2014
  5. '
  6. Const hlpMesage = "" & _
  7. "Команды могут быть с большой или маленькой буквы" & vbCrLf & _
  8. "Также можно вводить несколько команд" & vbCrLf & _
  9. "Список команд:" & vbCrLf & _
  10. "/s [путь к файлу] ; [путь для нового файла] ; [байтовый адрес]= Разделить файл" & vbCrLf & _
  11. "/j [главный файл] ; [пришиваемый файл] = Объединить два файла" & vbCrLf & _
  12. "/z [путь к zip архиву] ; [путь на диске] = Добавить в архив" & vbCrLf & _
  13. "/uz [путь к zip архиву] ; [путь в архиве] ; [папка на диске] = Извлеч из архива" & vbCrLf & _
  14. vbTab & "* Примечание папку на диске можно не указывать" & vbCrLf & _
  15. vbTab & "в этом случае это будет текущая папка" & vbCrLf & _
  16. "/r [путь к файлу] = Регистрация" & vbCrLf & _
  17. "/u [путь к файлу] = Отмена регистрации" & vbCrLf & _
  18. "/h или /help вызов этого сообщения" & vbCrLf & _
  19. "© FelixMacintosh 2014       http://www.cyberforum.ru/members/445967.html"
  20.  
  21. Private Shell As Object 'As Shell '
  22. Private Fso As Object 'As FileSystemObject '
  23. Private mArchive As Object
  24. '
  25. Private Type THREADENTRY32
  26.     dwSize As Long
  27.     cntUsage As Long
  28.     th32ThreadID As Long
  29.     th32OwnerProcessID As Long
  30.     tpBasePri As Long
  31.     tpDeltaPri As Long
  32.     dwFlags As Long
  33. End Type
  34.  
  35. Private Declare Function Thread32First Lib "kernel32" (ByVal hSnapshot As Long, ByRef lpte As THREADENTRY32) As Long
  36. Private Declare Function Thread32Next Lib "kernel32" (ByVal hSnapshot As Long, ByRef lpte As THREADENTRY32) As Long
  37. Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
  38. Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
  39. Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
  40. Private Declare Function OpenThread Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwThreadId As Long) As Long
  41. Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
  42. Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
  43.  
  44. Private Const INFINITE = -1&
  45. Private Const SYNCHRONIZE = &H100000
  46. Private Const TH32CS_SNAPTHREAD = &H4
  47.  
  48. Private Sub SS(ByVal Section$, ByVal Key$, Optional ByVal Setting$ = "0")
  49.     SaveSetting App.EXEName, Section, Key, Setting
  50. End Sub
  51.  
  52. Private Function GS(ByVal Section$, ByVal Key$, Optional ByVal Setting$ = "0")
  53.     GS = GetSetting(App.EXEName, Section, Key, "")
  54. End Function
  55.  
  56. Sub Main()
  57.     Const r = "/", p = " ", w = ";"
  58.     Dim f, i, j(), s, j1(), j2(), Start&, b() As Byte
  59.     Set Shell = CreateObject("Shell.Application")
  60.     Set Fso = CreateObject("Scripting.FileSystemObject")
  61.     j = Split(Command$, r)
  62.     s = Command$
  63.  
  64.     On Error Resume Next: DeleteSetting App.EXEName
  65.     On Error GoTo 1
  66.  
  67.     For f = 1 To UBound(j)
  68.         j1 = Split(Trim(j(f)), p, 2)
  69.         For i = 0 To UBound(j1): j1(i) = Trim(j1(i)): Next
  70.         '---------
  71.        Select Case LCase(j1(0))
  72.         Case "s"
  73.             j2 = Split(j1(1), w)
  74.             For i = 0 To UBound(j2): j2(i) = Trim(j2(i)): Next
  75.             SS "s", "Len", WriteBytes(j2(1), ReadBytes(j2(0), CLng(j2(2))))
  76.         Case "j"
  77.             j2 = Split(j1(1), w)
  78.             For i = 0 To UBound(j2): j2(i) = Trim(j2(i)): Next
  79.             Start = Fso.GetFile(j2(0)).Size + 1
  80.             SS "J", "Start", Start
  81.             SS "J", "Len", WriteBytes(j2(0), ReadBytes(j2(1)), Start) - 1
  82.         Case "uz"
  83.             j2 = Split(j1(1), w)
  84.             For i = 0 To UBound(j2): j2(i) = Trim(j2(i)): Next
  85.             If Fso.FileExists(j2(0)) And LCase(Fso.GetExtensionName(j2(0))) = "zip" Then
  86.                 If UBound(j2) = 1 Then
  87.                     ReDim Preserve j2(2): j2(2) = CurDir$
  88.                 End If
  89.                 Archive = Fso.GetAbsolutePathName(j2(0))
  90.                 SS "uz", UnZipFile(j2(1), j2(2))
  91.             End If
  92.            
  93.         Case "z"
  94.             j2 = Split(j1(1), w)
  95.             For i = 0 To UBound(j2): j2(i) = Trim(j2(i)): Next
  96.             If Fso.FileExists(j2(0)) And LCase(Fso.GetExtensionName(j2(0))) = "zip" Then
  97.                 'Используем архив
  98.                Archive = Fso.GetAbsolutePathName(j2(0))
  99.                 SS "z", CopyPathToArchive(Fso.GetAbsolutePathName(j2(1)))
  100.             ElseIf LCase(Fso.GetExtensionName(j2(0))) = "zip" Then
  101.                 'Создаём архив
  102.                CreateArchive Fso.GetAbsolutePathName(j2(0))
  103.                 SS "z", CopyPathToArchive(Fso.GetAbsolutePathName(j2(1)))
  104.             End If
  105.         Case "r"
  106.             SS "r", RegSvr32(j1(1))
  107.         Case "u"
  108.             SS "u", RegSvr32(j1(1), True)
  109.         Case "h", "help"
  110.             SS "h", MsgBox(hlpMesage)
  111.         Case Else
  112.             'Не выполнена ни одна комманда
  113.        End Select
  114.     Next
  115.     '-------------------------Конец программы
  116.    Set Shell = Nothing
  117.     Set Fso = Nothing
  118.     Exit Sub
  119. 1
  120. End Sub
  121.  
  122. Private Function CopyHere(Parent, vItem) As Boolean
  123.     '
  124.    'Функция копирования
  125.    'Аргументы: Папка (Zip-папка) // Копируемый объект
  126.  
  127.     Dim f&, Key$, hnd&
  128.     Dim Trd(2) As Collection
  129.     Dim tid As Long, hTrd As Long
  130.     On Error Resume Next
  131.  
  132.     'Получаем список потоков !
  133.    GetThreadsList Trd(0) 'Запомнить старые потоки
  134.    Call Parent.CopyHere((vItem)) 'Копирование >>>>>>>>>>>>
  135.    GetThreadsList Trd(1) 'Запомнить новые потоки
  136.    
  137.     If vItem.Count > 0 Then If Err.Number = 0 Then GoTo 1 'В этом случае ждать не нужно
  138.    
  139.     Err.Clear 'Сброс всех ошибок
  140.  
  141.     Set Trd(2) = New Collection
  142.     For f = Trd(1).Count To 1 Step -1
  143.         Key = "C" & Trd(1).Item(f)
  144.         hnd = Trd(0)(Key)
  145.         If hnd = 0 Then Trd(2).Add CLng(Mid$(Key, 2))
  146.     Next
  147.  
  148.     For f = 1 To Trd(2).Count 'Ожидание открытых потоков
  149.        tid = Trd(2).Item(f)
  150.         hTrd = OpenThread(SYNCHRONIZE, False, tid)
  151.         WaitForSingleObject hTrd, INFINITE
  152.         CloseHandle hTrd
  153.     Next
  154.     CopyHere = True
  155.     Exit Function
  156. 1
  157. End Function
  158.  
  159.  
  160. Private Sub GetThreadsList(List As Collection)
  161.     '
  162.    '   Возвращает List с коллекцией потоков
  163.    '
  164.    Dim hSnap As Long, TE As THREADENTRY32, PID As Long
  165.     Set List = New Collection
  166.     hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0)
  167.     If hSnap = -1 Then Exit Sub
  168.     TE.dwSize = Len(TE)
  169.     PID = GetCurrentProcessId()
  170.     If Thread32First(hSnap, TE) Then
  171.         Do
  172.             If TE.th32OwnerProcessID = PID Then List.Add TE.th32ThreadID, "C" & CStr(TE.th32ThreadID)
  173.         Loop While Thread32Next(hSnap, TE)
  174.     End If
  175.     CloseHandle hSnap
  176. End Sub
  177.  
  178.  
  179. Public Function UnZipFile(ByVal ParseName$, ByVal DestPath$) As Boolean
  180.     '
  181.    'Извлечение из архива
  182.    'Аргументы:
  183.    'DestPath - Путь к папке для распаковки архива
  184.    'ParseName - Путь в архиве
  185.    'Примечание: Имена файлов в архиве, должны быть полными !
  186.    '
  187.    Dim DestDir As Object, Parse As Object
  188.     If (mArchive Is Nothing) Then Exit Function 'Проверяем указан ли архив ?
  189.    On Error GoTo 1
  190.    
  191.     If Not Fso.FolderExists(DestPath) Then 'Проверяем есть ли папка
  192.        Fso.CreateFolder (DestPath) 'Создаём папку для перемещаемых туда объектов
  193.    End If
  194.    
  195.     Set DestDir = Shell.NameSpace((DestPath))
  196.     Set Parse = mArchive.ParseName((ParseName))
  197.     UnZipFile = CopyHere(DestDir, Parse)
  198.     Exit Function
  199. 1
  200. End Function
  201.  
  202. Public Function NameArchiveFiles$(Optional ByVal ind&, Optional ByVal NameOnly As Boolean)
  203.     '
  204.    'Возврат имени файла в архиве
  205.    'Аргументы:
  206.    'ZipName - имя архива
  207.    'Ind - номер файла в архиве (начало с 0), по умолчанию - 0
  208.    'NameOnly - Только имя, без расширения
  209.    '
  210.    If (mArchive Is Nothing) Then Exit Function 'Проверяем указан ли архив ?
  211.    On Error Resume Next
  212.     If NameOnly Then
  213.         NameArchiveFiles = mArchive.items().Item((ind)).Рath
  214.     Else
  215.         NameArchiveFiles = mArchive.items().Item((ind)).Name
  216.     End If
  217. End Function
  218.  
  219. Public Function CopyPathToArchive(ByVal FilePath$) As Boolean
  220.     '
  221.    'Копирует файл / папку в архив
  222.    'Арг: полное имя
  223.    '
  224.    If (mArchive Is Nothing) Then Exit Function 'Проверяем указан ли архив ?
  225.    If Len(Dir(FilePath, vbDirectory)) > 0 And Len(Dir(FilePath)) = 0 Then
  226.  
  227.         If Shell.NameSpace((FilePath)).items.Count = 0 Then
  228.             MsgBox ("Нельзя добавить пустую папку")
  229.             Exit Function
  230.         End If
  231.     End If
  232.     'mArchive.CopyHere (FilePath)
  233.    CopyPathToArchive = CopyHere(mArchive, FilePath) 'Копируем в архив
  234. End Function
  235.  
  236. Public Function CreateArchive(ByVal Рath$) As Boolean
  237.     '
  238.    'Создаёт новый архив
  239.    'Возврат утверждения о создании
  240.    '
  241.    If Fso.FileExists(Рath) Then Kill Рath
  242.     Fso.CreateTextFile(Рath, True).Write "PK" & Chr(5) & Chr(6) & String(18, 0)
  243.     Set mArchive = Shell.NameSpace((Рath))
  244.     CreateArchive = Not (mArchive Is Nothing) 'Возврат утверждения о создании
  245. End Function
  246.  
  247.  
  248.  
  249. Public Property Get Archive() As Variant
  250.     '
  251.    'Возвращает объект архива
  252.    '
  253.    Set Archive = mArchive
  254. End Property
  255.  
  256. Public Property Let Archive(ByVal vNewValue As Variant)
  257.     '
  258.    'Свойство: Archive = Файловый путь
  259.    'Арг: полное имя
  260.    '
  261.    If Fso.FileExists(vNewValue) Then
  262.         Set mArchive = Shell.NameSpace((vNewValue))
  263.     End If
  264. End Property
  265.  
  266.  
  267. Private Function RegSvr32(Path$, Optional UnReg As Boolean) As Boolean
  268.     Const INFINITE = -1&, SYNCHRONIZE = &H100000
  269.     Dim hProc&, hShell&
  270.    
  271.     If Fso.FileExists(Path) = False Then Exit Function
  272.     Select Case LCase(Fso.GetExtensionName(Path))
  273.     Case "dll", "ocx"
  274.     Case Else: Exit Function
  275.     End Select
  276.  
  277.     If UnReg Then
  278.         hShell = Shell("RegSvr32 /s /u " & Path)
  279.     Else
  280.         hShell = Shell("RegSvr32 /s " & Path)
  281.     End If
  282.  
  283.     hProc = OpenProcess(SYNCHRONIZE, False, hShell)
  284.     WaitForSingleObject hProc, INFINITE
  285.     CloseHandle hProc
  286.     RegSvr32 = True
  287. End Function
  288.  
  289.  
  290. Private Function ReadBytes(FileName$, Optional ByRef Start&, Optional ByVal dln&) As Byte()
  291.     'Чтение байт из файла
  292.    'Арг: Путь // Старт // Длина по умолчанию всего файла
  293.    'Возврат: Массив байт и следующая позиция чтения
  294.    Dim n, f: On Error Resume Next
  295.     f = FreeFile
  296.     Open FileName For Binary As #f
  297.     If Start Then Else Start = 1
  298.     n = LOF(f) - Start + 1
  299.     If dln = 0 Or dln > n Then dln = n
  300.     ReDim Preserve ReadBytes(dln - 1)
  301.     Get #f, Start, ReadBytes: Close #f
  302.     If Err = 0 Then Start = Start + UBound(ReadBytes) + 1
  303. End Function
  304.  
  305. Private Function WriteBytes&(FileName$, Bytes() As Byte, Optional ByVal Start&, _
  306. Optional Overwrite As Boolean)
  307.     'Запись байт в файл
  308.    'Арг: Путь // Массив байт // Старт // Флаг перезаписи
  309.    'Возврат: Следующая позиция записи (при успешном выполнении)
  310.    Dim n, f: On Error Resume Next
  311.     If Start Then Else Start = 1
  312.     f = FreeFile 'Определяем номер свободного файла
  313.    If Overwrite Then Kill FileName
  314.     Open FileName$ For Binary As #f: Put #f, Start, Bytes: Close #f 'Копируем !
  315.    If Err = 0 Then WriteBytes = Start + UBound(Bytes) + 1
  316. End Function

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.083 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут