Как назначить текущий путь?

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

Как назначить текущий путь?

Сообщение JWST » 21.02.2006 (Вт) 21:18

У меня две программы.

1. для замены одной инфы на другую в файле ini
(файл назначается как параметр) (название проги UnRep)

2. запуск программ перечисленных в файле через конструкцию SHELL FileName, vbMinimized.
(файл назначается как параметр) (название проги MiniCMD)

Для общего пользования я переписываю файл UnRep в папку C:\Windows\System32

теперь я беру и делаю CMD файл, который выглядит так:

regedit
msconfig
UnRep proba.ini

в папке которой я работаю находится три файла.

1. proba.ini
2. MiniCMD.exe
3. go.cmd

запускаю программу с параметром (MiniCMD go.cmd)

запускается regedit (1-я строка сработала)
запускается msconfig (2-я строка сработала)

запускается UnRep и пишет "Не могу найти файл".

Если я переписываю файл UnReg в ту же папку, т.е. получается так:

1. proba.ini
2. MiniCMD.exe
3. go.cmd
4. UnRep.exe

то всё срабатывает а если UnRep находится в C:\Windows\System32
то не может найти файл.

Я пробовал делать так (в фале UnRep):
FileName = CurDir$()+FileName

Не помогло. Почему-то пишет C:\Document and Setting\Имя пользователя\proba.ini , хотя запускаю совсем из другой папки.

Я хочу узнать... если я запускаю файл из определённой папки, то как мне задать жёстко путь этой папки?

Повторюсь ещё раз если запутались. Если я запускаю программу 1 сам и передаю ей имя файла, то программа 1 находит файл. Если программу 1 с передачей ей имени файла запускает программа 2, то файл не видится. Программа один находится в Win\SYS32 а программа 2 и обрабатываемый файл в другой папке.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.02.2006 (Вт) 22:12

Не могу догадаться в чём проблема, почему прога не может найти файл:
Либо файла нет!
Либо неправильно передан путь!

Если первое - сам виновать, ищи у себя ошибку
Если второе - знай передавать пути всегда надо в кавычках, ВСЕГДА!

Ну и на всякий случай:
Код: Выделить всё
SetPath = "C:\Diriams\Gootlon\Bifuner\"
ChDrive Left(SetPath,3)
ChDir SetPath
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

JWST
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 07.01.2006 (Сб) 21:05

Сообщение JWST » 21.02.2006 (Вт) 23:07

Короче я так и думал, что будет трудно понять, но может так кто поймёт:
Текст проги 1:
Код: Выделить всё

Private Sub Form_Load()

    ' параметр командной строки
    strcm = Command()
   
    ' назначить параметр FileName командной строкой
    FileName = Trim(strcm)
     
    ' проверка на пустышность
    If FileName = "" Then
                   MsgBox "Не могу найти файл или неправильные параметры!"
               unload me
     End If

    'если файла нет
    If Len(Dir$(FileName)) <= 0 Then
               MsgBox "Не могу найти файл или неправильные параметры!"
               Unload me
     End If

GoFile = "Прога2.exe "+FileName
Shell GoFile,vbminimized
   
Unload Me
End Sub


Текст проги 2:

Код: Выделить всё

Private Sub Form_Load()

   ' проверка на наличие параметров как в первой проге и назначение переменной FileName
   ...

     ' системные переменные
    SysDrv = Environ$("SYSTEMDRIVE") ' Системная папка. пример - C:

  ' открытие файла и его чтение
    Open FileName For Binary As #1
    bufer$ = Space(FileLen(FileName))
    Get #1, 1, bufer$
    Close 1

   ' замена (основная работа программы)
   bufer = Replace(bufer, "%SYSTEMDRIVE%", SysDRV, , , vbTextCompare)

    ' запись обновленного файла
    Open FileName For Output As #2
    Print #2, bufer
    Close #2

Unload Me
End Sub


теперь я беру и прогу 2 кладу в папку C:\Windows\System32 для общего пользования.

для примера создаю файл proba.ini с таким текстом:

%SYSTEMDRIVE%\Program Files\Yes


теперь в отдельную папку кладу:

1. Прогу1.exe и
2. proba.ini

Мышкой кладу proba.ini на файл "Прога1.exe". В этот момент "Прога1" запускает "Прогу2" с параметром "proba.ini"
Код: Выделить всё

GoFile = "Прога2.exe "+FileName
Shell GoFile,vbminimized


Прога2 должна произвесит замену, но она не может найти файл. ПОчему? И как сделать чтобы нашла?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.02.2006 (Вт) 23:15

1)
Наверное всё-таки:

Код: Выделить всё

GoFile = Chr(34)+"Прога2.exe "+chr(34)+chr(32)+chr(34)+FileName +chr(34)
Shell GoFile,vbminimized


Поясняю 34 - это кавычка, 32 - пробел.
А ещё лучше использовать ShellExecute. Вроде бы он сам кавычки ставит... :?

2) Не уловил смысл проги, которая пускает другую прогу. Какой смысл перенаправлять параметр файла. Что-то вроде

Код: Выделить всё

Function F1(Param As String)
     F1 = F2(Param)
End Function

Function F2(Param As String)
     F2 = Len(Param)
End Function

Какой в этом примере смысл F1?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

JWST
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 07.01.2006 (Сб) 21:05

Сообщение JWST » 21.02.2006 (Вт) 23:45

Код: Выделить всё

GoFile = Chr(34)+"Прога2.exe "+chr(34)+chr(32)+chr(34)+FileName +chr(34)
Shell GoFile,vbminimized

попробую так.

А ещё лучше использовать ShellExecute

это сложно? Приведите пример пожалуйста.


Не уловил смысл проги, которая пускает другую прогу


Просто я сократил текст проги1. На самом деле она запускает много файлов с параметром 'proba.ini' и среди этих прог есть и прога2.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 22.02.2006 (Ср) 0:12

Объявляем так:
Код: Выделить всё

Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long


hWnd - это Me.hWnd окна, октуда ты запускаешь прогу. Если это окно после запуска др. проги сразу-же закроется используй ByVal 0
lpOperation - передавай vbNullString
lpFile - "Прога2.exe"
lpParameters - параметры
lpDirectory - специально для тебя :) - директория т.е. путь.
nShowCmd - ты используешь minimized, но мне кажется, что тебе надо, чтоб эта прога вообще была не видна - тогда SW_HIDE.

Может так понятнее:
Api Guide писал(а):· hwnd
Specifies a parent window. This window receives any message boxes that an application produces. For example, an application may report an error by producing a message box.

· lpOperation
Pointer to a null-terminated string that specifies the operation to perform. The following operation strings are valid:
“open”
The function opens the file specified by lpFile. The file can be an executable file or a document file. The file can be a folder to open.
“print”
The function prints the file specified by lpFile. The file should be a document file. If the file is an executable file, the function opens the file, as if “open” had been specified.
“explore”
The function explores the folder specified by lpFile.

The lpOperation parameter can be NULL. In that case, the function opens the file specified by lpFile.

· lpFile
Pointer to a null-terminated string that specifies the file to open or print or the folder to open or explore. The function can open an executable file or a document file. The function can print a document file.

· lpParameters
If lpFile specifies an executable file, lpParameters is a pointer to a null-terminated string that specifies parameters to be passed to the application.
If lpFile specifies a document file, lpParameters should be NULL.

· lpDirectory
Pointer to a null-terminated string that specifies the default directory.

· nShowCmd
If lpFile specifies an executable file, nShowCmd specifies how the application is to be shown when it is opened. This parameter can be one of the following values:
SW_HIDE
Hides the window and activates another window.
SW_MAXIMIZE
Maximizes the specified window.
SW_MINIMIZE
Minimizes the specified window and activates the next top-level window in the Z order.
SW_RESTORE
Activates and displays the window. If the window is minimized or maximized, Windows restores it to its original size and position. An application should specify this flag when restoring a minimized window.
SW_SHOW
Activates the window and displays it in its current size and position.
SW_SHOWDEFAULT
Sets the show state based on the SW_ flag specified in the STARTUPINFO structure passed to the CreateProcess function by the program that started the application. An application should call ShowWindow with this flag to set the initial show state of its main window.
SW_SHOWMAXIMIZED
Activates the window and displays it as a maximized window.
SW_SHOWMINIMIZED
Activates the window and displays it as a minimized window.
SW_SHOWMINNOACTIVE
Displays the window as a minimized window. The active window remains active.
SW_SHOWNA
Displays the window in its current state. The active window remains active.
SW_SHOWNOACTIVATE
Displays a window in its most recent size and position. The active window remains active.
SW_SHOWNORMAL
Activates and displays a window. If the window is minimized or maximized, Windows restores it to its original size and position. An application should specify this flag when displaying the window for the first time.

If lpFile specifies a document file, nShowCmd should be zero.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

JWST
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 07.01.2006 (Сб) 21:05

Сообщение JWST » 22.02.2006 (Ср) 1:19

Ох как-то тяжело у меня получается и я не могу понять что сделать. Как я понял нужно для запуска программы нужно прописать полный путь
Код: Выделить всё

GoFile = "Прога2.exe "+ FullPatch + FileName
Shell GoFile,vbminimized


и возник вопрос как узнать этот полный путь?

для примера можно привести такой код:

Код: Выделить всё

    ' параметр командной строки
    strcm = Command()
   
    ' назначить параметр FileName командной строкой
    FileName = Trim(strcm)

    FullPath = Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!????

msgbox "полный путь к файлу -", FullPath


откомпилить файл (название пример GoGo.exe) и положить его в c:\windows\system32

создать primer.ini

и создать primer.cmd с текстом:

GoGo primer.ini


запустить primer.cmd

А как узнать параметр FullPath ?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 22.02.2006 (Ср) 1:30

Когда ты натаскиваешь файл на прогу полный путь передайтся сам! Пробовал заключать в кавычки
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

JWST
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 07.01.2006 (Сб) 21:05

Сообщение JWST » 22.02.2006 (Ср) 1:34

Когда ты натаскиваешь файл на прогу


когда натаскиваю, то да... передаётся, а я же привёл пример, кода я не вручную передаю, а когда параметр передаётся из файла CMD (ну или из другой программы)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 22.02.2006 (Ср) 1:37

Тогда эта программа или Cmd-файл должен передавать твоей проге полный путь. Иначе никак. Неполный путь может быть только тогда, когда CurDir и тот путь, где этот файл лежит совпадает.

Т.е. если у тебя предполагается какой-то путь по умолчанию ты можешь его поставить как текущий с помощью ChDrive + ChDir и тогда, если вдруг указан неполный путь к файлу, VB попробует его найти ещё и там. Только так...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

JWST
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 07.01.2006 (Сб) 21:05

Сообщение JWST » 22.02.2006 (Ср) 8:25

Странно как-то получается. Если прогу сделать так:

Код: Выделить всё

' параметр командной строки
    strcm = Command()
   
    ' назначить параметр FileName командной строкой
    FileName = Trim(strcm)

     ' открытие файла и его чтение
    Open FileName For Binary As #1
    bufer$ = Space(FileLen(FileName))
    Get #1, 1, bufer$
    Close 1

    FullPath = Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!????

msgbox bufer
msgbox "полный путь к файлу -", FullPath


а зтем запустить её из CHM файла:
GoGo primer.ini


файл primer.ini лежит в той же папки, что и CMD-файл
GoGo.exe в папке C:\Windows\System32

После запуска CMD-файла программа GoGo запросто покажет текст файла :
msgbox bufer


ну раз она его открывает, то как узнать FullPath ?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 22.02.2006 (Ср) 8:51

Можно проверить если CurDir+FileName существует, то CurDir - это и есть путь (в смысле дириктория). Вот ты написал этот примерчик. А перед msgbox bufer (кст. buFFer - 2 F) поставь msgbox curdir и проверь, не будет ли текст сообщения тем, что тебе надо.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 22.02.2006 (Ср) 8:54

app.path не подойдет :?:
الفيجوال بيسك الرابح

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 22.02.2006 (Ср) 8:58

GM писал(а):app.path не подойдет :?:


Неа, у него этот ini лежит вообще чёрт знает где, но так как прога его может открыть, значит он либо в CurDir либо в одной из PATH
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

CORBA
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 22.11.2003 (Сб) 13:41
Откуда: Ukraine-Crimea-Feodosia

Сообщение CORBA » 22.02.2006 (Ср) 10:16

2JWST

Попробуй так cd + FileName
У каждой сложной задачи есть множество простых для понимания, но неправильных решений.

JWST
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 07.01.2006 (Сб) 21:05

Сообщение JWST » 23.02.2006 (Чт) 12:04

CurDir не подходит. А можно ли назначить CurDir ? Или узнать путь с которого программа запущена (т.е. не там где она лежит, а именно там с какой папки запущена). Да она действительно лежит в одной из "в одной из PATH".

И вот ещё что. Если программа лежит в PATH, но файл открывает в текущей папке (и действительно открывает), то значит она можно же показать путь к этому файлу. Вот меня и интересует как узнать этот путь?

Попробуй так cd + FileName


а по точней, это как?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 23.02.2006 (Чт) 15:00

Теоретически, когда запускается программа в CurDir помещается именно путь, с которого она запущена.

А
cd+FileName
, мне кажется cd это и есть CurDir.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

JWST
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 07.01.2006 (Сб) 21:05

Сообщение JWST » 23.02.2006 (Чт) 19:13

Как то что-то непонятно получается. Вот программа (можете откомпилить и попробовать)
Код: Выделить всё

' параметр командной строки
    strcm = Command()
   
    ' назначить параметр FileName командной строкой
    FileName = Trim(strcm)

     ' открытие файла и его чтение
    Open FileName For Binary As #1
    bufer$ = Space(FileLen(FileName))
    Get #1, 1, bufer$
    Close 1

    ' FullPath = Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!????

msgbox bufer
msgbox CurDir$()
'msgbox "полный путь к файлу -", FullPath


теперь откомилим её в файл GoGo.exe и поместим в PATH

возьмём для примера любой файл (ini или txt маленький) и положем рядом с созданным CMD файлом в отдельную папку. текс CMD такой:
GoGo primer.ini


Запустите и попробуйте и увидите, что программа откроет файл и покажет его содержимое:
msgbox bufer

а вот затем покажет почему то приблизительно так:
C:\Document and Setting\Имя пользователя
хотя код был:
msgbox CurDir$()


И вот я после этого сидел и не мог понять а что показывает этот CurDir$()? Зачем вообще это нужно?

И как мне найти тот путь в котором находится запросто открывающийся файл primer.ini ???

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 23.02.2006 (Чт) 20:14

CurDir -- это текущий каталог. Что тут непонятного?
Если запускаешь из "C:\Document and Setting\Имя пользователя", то именно это и будет текущим каталогом.
Lasciate ogni speranza, voi ch'entrate.

JWST
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 07.01.2006 (Сб) 21:05

Сообщение JWST » 23.02.2006 (Чт) 20:21

alibek - вы попробовали бы текущий код, а уж потом бы рассуждали и говорили про текущий какталог. Я даже код привёл и по предложениям написал куда положить и как запустить, а вам было лень попробовать. Запускаю я между прочим из C:\PRM1, именно там находится два файла primer.ini и start.cmd
а вот строка в программе:
msgbox CurDir$()

выводит путь C:\Document and Setting\Имя пользователя , хотя ещё раз напомню, запускаю я из C:\PRM1

вот я спрашиваю как узнать текущий путь?

p.s. сама программа если вы читали, то видите находится в PATH (C:\Windows\System32)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 23.02.2006 (Чт) 20:27

Еще раз.
CurDir - это текущий каталог.
Каталог, откуда программа запускается - App.Path.
Если нет понимания разницы этих двух терминов, рекомендую написать программу, состоящую из MsgBox CurDir$(), создать к ней несколько ярлыков с разными "Рабочий каталог" и посмотреть результаты.
Lasciate ogni speranza, voi ch'entrate.

JWST
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 07.01.2006 (Сб) 21:05

Сообщение JWST » 23.02.2006 (Чт) 20:37

alibek - я прекрасно понимаю что App.Path это путь где лежит сама программа. В моём примере это C:\Windows\system32, это сделано специально, чтобы программа могла запуститься из любого места. Теперь я запускаю её не сам, а через CMD файл, который находится в папке C:\PRM1 и почему то строка програмы "MsgBox CurDir$()" выводит мне не этот путь (C:\PRM1) а C:\Document and Setting\Имя пользователя.

Может быть если программа не лижит в PATH (C:\Windows\system32) и запускается при помощи ярлыков, то она показывает реальный путь, но если она запускается через CMD или BAT файл , то она показывает C:\Document and Setting\Имя пользователя.

В связи с этим если программу запускает CMD или BAT или другая программа, то CurDir$() покажет не место запуска , а C:\Document and Setting\Имя пользователя.

Обидно, то что если программа должна открывать файл, то она его откроет, но путь к этому файлу программа показать не может и как указать ей реальный (текущий) путь я уже третьи сутки добиться не могу.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 23.02.2006 (Чт) 21:08

Если CurDir показывает "C:\Document and Setting\Имя пользователя", значит именно с этого места твоя программа и запущена.
Поскольку этот путь -- домашний каталог профиля пользователя, то возможно дело в том, что ты его неправильно запускаешь.
Может быть через cmd /c go.bat, может еще как-то, что создается новый шелл с рабочим каталогом по умолчанию (домашним каталогом).
Проблемы надо искать не в CurDir, а в способе вызова твоей программы.
Lasciate ogni speranza, voi ch'entrate.

JWST
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 07.01.2006 (Сб) 21:05

Сообщение JWST » 24.02.2006 (Пт) 1:15

alibek а попробовать как я предлагаю трудно? и сразу станет всё ясно. Я тоже считал так как вы говорите, но после того как мою прогамму находящуюся в PATH запустила другая программа, я понлял, что всё запросто может быть совершенно по другому и решение так и не нашёл. Спрашиваю здесь, а вместо дельных советов, не то чтобы их дать... даже попробовать по написанному не могут.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.02.2006 (Пт) 1:55

Ок, убедил.
Скомпилировал тестовую прогу, поместил ее в <windows>\system32.
Запускал и из BAT-файла, и из командной строки.
Все работает именно так, как должно.
Lasciate ogni speranza, voi ch'entrate.


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

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

Сейчас этот форум просматривают: Yandex-бот и гости: 69

    TopList