|
|
|
Про GetModuleFileName
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, возникла такая проблема- есть вот такой кусочек кода: CString progName, path; char lp[1000]; progName="myprog.exe"; GetModuleFileName(GetModuleHandle(NULL), lp, 1000 ); path=lp; path.Delete(path.Find(progName, 0),progName.GetLength()); statFilePath=path+"data/stat.dat"; В общем, нужно получить путь к рабочей директории, потом я там с файлами работаю. У меня на машине все работает нормально (и на большинстве других вроде тоже), но в одном из случаев, узнал чисто случайно, программа выдает такую ошибку: FILES\LEARN TELEPATHY\MYPROG.EXEdata/stat.dat contains an invalid path То есть, насколько я могу судить, MYPROG.EXE не удаляется, поскольку пребывает в верхнем регистре, вместо этого удаляется С:\PROGRAM из начала строки. Так вот вопрос, почему эта ошибка возникает? (я у себя переименовал этот файл написав имя верхнем регистре, все равно программа работает) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2005, 11:50 |
|
||
|
Про GetModuleFileName
|
|||
|---|---|---|---|
|
#18+
Ну. Если уж нравится так извращаться, то перед delete добать path.MakeLower(); А вообще можно исп. winapi функции: Код: plaintext 1. 2. 3. 4. 5. 6. а можно еще по-другому....... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2005, 12:52 |
|
||
|
Про GetModuleFileName
|
|||
|---|---|---|---|
|
#18+
А чем не нравится функция GetCurrentDirectory ? Делает почти то, что надо. Она, правда, возвращет не путь из которого запустили программу, а текущий каталог. Но обычно, после старта проги это одно и то же. Или интересуют как раз случаи, когда это не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2005, 13:09 |
|
||
|
Про GetModuleFileName
|
|||
|---|---|---|---|
|
#18+
Хе. Вот тебе пример. Если прога запускается из батника, то функция GetCurrentDirectory вернет папку, в которой лежит батник. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2005, 13:31 |
|
||
|
Про GetModuleFileName
|
|||
|---|---|---|---|
|
#18+
SeraTJХе. Вот тебе пример. Если прога запускается из батника, то функция GetCurrentDirectory вернет папку, в которой лежит батник. Да я знаю И если запускать через ярлык, то в параметрах тоже можно явно другой каталог указать... Но вдруг у автора ситуация попроще :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2005, 13:39 |
|
||
|
Про GetModuleFileName
|
|||
|---|---|---|---|
|
#18+
Дело в том, что ситуация, когда запускается через ярлык вполне возможна. Спасибо за советы. Интересно было-бы узнать, чем все-таки обусловлен такой частный случай на одной отдельно взятой машине ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2005, 14:14 |
|
||
|
Про GetModuleFileName
|
|||
|---|---|---|---|
|
#18+
SeraTJХе. Вот тебе пример. Если прога запускается из батника, то функция GetCurrentDirectory вернет папку, в которой лежит батник. Обманывать не хорошо. СтудентищеИнтересно было-бы узнать, чем все-таки обусловлен такой частный случай на одной отдельно взятой машине Две самые частые проблемы с путями это: Разные файловые системы (NTFS, FAT, FAT32, сетевой каталог или вообще экзотика какая-нибудь). На разных машинах могут быть установлены разные локали. В данном случае, наиболее правильно будет использовать GetModuleFileName() потом искать последние вхождение слэша в строку и обрубать строку по нему. Использовать CString.Find() - верный путь к проблемам. А вдруг юзер поименует каталог твоей программы на основе имени твоей программы, а? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2005, 18:07 |
|
||
|
Про GetModuleFileName
|
|||
|---|---|---|---|
|
#18+
White Owl SeraTJХе. Вот тебе пример. Если прога запускается из батника, то функция GetCurrentDirectory вернет папку, в которой лежит батник. Обманывать не хорошо. "Обманывать не хорошо." - Это, простите, кому адресуется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2005, 20:12 |
|
||
|
Про GetModuleFileName
|
|||
|---|---|---|---|
|
#18+
SeraTJ White Owl SeraTJХе. Вот тебе пример. Если прога запускается из батника, то функция GetCurrentDirectory вернет папку, в которой лежит батник. Обманывать не хорошо. "Обманывать не хорошо." - Это, простите, кому адресуется? Тому, кто сказал что если программа запускается из батника, то функция GetCurrentDirectory вернет папку, в которой лежит батник. На текущий каталог программы местонахождение батника влияния не оказывает совершенно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2005, 22:14 |
|
||
|
Про GetModuleFileName
|
|||
|---|---|---|---|
|
#18+
White Owl Тому, кто сказал что если программа запускается из батника, то функция GetCurrentDirectory вернет папку, в которой лежит батник. На текущий каталог программы местонахождение батника влияния не оказывает совершенно. мда... тяжелый случай. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. На! Запусти ее непосредственно. Затем в другой папке создай go.bat: path\program.exe и полюбуйся. И не надо вылезать со своими "обманывать не хорошо", если сам ничего не знаешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2005, 13:06 |
|
||
|
Про GetModuleFileName
|
|||
|---|---|---|---|
|
#18+
SeraTJ Затем в другой папке создай go.bat: path\program.exe и полюбуйся. И не надо вылезать со своими "обманывать не хорошо", если сам ничего не знаешь. Ой плачу не могу. Лапочка, ты как свой батник запускаешь? В Проводнике мышкой щелкаешь? А теперь сделай ярлычок для своего батника, положи ярлычок на рабочий стол и запусти через ярлычок. Посмотри на вывод свой программы. А теперь пойди в свойства свежесозданного ярлычка и поправь там поле "Start In" на что-нибудь. Запусти еще раз. Удивись. А можешь поправь свой батник чтобы он был вида: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2005, 19:55 |
|
||
|
Про GetModuleFileName
|
|||
|---|---|---|---|
|
#18+
Не понимаю Ваших наездов и брызгов, многоуважаемый лапочка! Прошу прочесть еще раз содержимое этого топика, только повнимательнее, пожалуйста. Товарища "redskin"-а интересовали случаи, когда функция GetCurrentDirectory вернет папку, отличную от той, в которой находится exe. Я привела пример. А придумать способы, как запустить программу так, чтобы текущая директория была директорией программы нечего делать, Вы только что мне эти способы нашли (ничего нового для меня не было, замечу). Btw, батничек я запускаю из far-a. Люблю, знаете ли эту программу. С уважением, SeraTJ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2005, 20:50 |
|
||
|
Про GetModuleFileName
|
|||
|---|---|---|---|
|
#18+
SeraTJЯ привела пример. Некорректный и не соотвествующий действительности. Каждая программа имеет свой текущий каталог. Каким он будет в момент старта программы решает программа запускающая нашу. Для случая FAR это всегда тот каталог который открыт на панельке. Местонахождение батника к текущему каталогу программы запускаемой из батника отношения не имеет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2005, 21:08 |
|
||
|
Про GetModuleFileName
|
|||
|---|---|---|---|
|
#18+
White Owl Некорректный и не соотвествующий действительности. Опять не соглашусь. Как контр-пример мой пример был вполне допустимым. Пусть содержимое бат-файла: C:\path\path\myprog.exe, сам бат-файл в папке С:\. Если запустить bat из своей папки, то любой файловый менеждер (фар, проводник и т.д.) или просто командная строка dos установит текущим каталогом программы С:\ -- то есть папку, в которой лежит сам батник или, говоря другими словами, папку, откуда запустили этот бат-файл. Елки. Мой пример можно назвать некорректным, только если очень-очень-очень сильно придираться к словам. К тому же для меня было главным показать, что в данном случае НЕЛЬЗЯ использовать GetCurrentDirectory. Может, я не очень хорошо выразилась, но, думаю, все, кроме вас, меня поняли. Все, достал уже этот бесполезный спор. Тем более на фоне такого: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 11:35 |
|
||
|
Про GetModuleFileName
|
|||
|---|---|---|---|
|
#18+
Кстати, никто не сказал, что КурренДир может меняться в программке-то ... так что если ты хочешь быть уверен, что берешь файл из каталога c:\prog\ то надо его вычислять из полного пути запускаемого файла. -- With best regards, Karabas Barabas Posted via ActualForum NNTP Server 1.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 11:37 |
|
||
|
Про GetModuleFileName
|
|||
|---|---|---|---|
|
#18+
Вобщем-то, про это я и говорю, что использовать GetCurrentDir нельзя, нужно использовать путь запускаемого файла. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 12:25 |
|
||
|
Про GetModuleFileName
|
|||
|---|---|---|---|
|
#18+
SeraTJПусть содержимое бат-файла: C:\path\path\myprog.exe, сам бат-файл в папке С:\. Если запустить bat из своей папки, то любой файловый менеждер (фар, проводник и т.д.) или просто командная строка dos установит текущим каталогом программы С:\ -- то есть папку, в которой лежит сам батник или, говоря другими словами, папку, откуда запустили этот бат-файл. Елки. Нет, не установит. :) Текущим каталогом останется та самая "своя папка". Вот есть у тебя батник C:\Go.bat с показаным содержимым? Перейди в каталог C:\path и дай команду \Go.bat , текущим каталогом останется \path. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2005, 18:21 |
|
||
|
Про GetModuleFileName
|
|||
|---|---|---|---|
|
#18+
эххх, как хочу я тебя найти.. и лопатой по башке .... ))))))) ладно, поменьше лирики Люди добрые! ну, кто-нибудь, вступитесь за меня. ну, что он пристал???? Так, White Owl-придира, слушай сюда. Ты опять неправильно понял то, что я сказала. Сейчас я ЕЩЕ РАЗ повторю последнюю фразу, которую ты прокомментировал, исправлю неточности. Я тебя умоляю, прочитай ее внимательно, а не через строчку... И Если ты опять не согласишься --- ПИШИ сюда. Я ХОЧУ ЗНАТЬ, В ЧЕМ Я НЕПРАВА. Рассмотрим бат-файл: C:\Go.bat : Код: plaintext Заходим в любой файловый менеждер (фар, проводник и т.д.) или просто командную строку dos в папку C:\. ЗДЕСЬ_ЗДЕСЬ запускаем go.bat. ТОГДА > CurrentDirectory(myprog) = "C:\"; cd path -- переходим в папку c:\path Выполняем команду: ..\go.bat ТОГДА > CurrentDirectory(myprog) = "C:\path"; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2005, 19:35 |
|
||
|
Про GetModuleFileName
|
|||
|---|---|---|---|
|
#18+
SeraTJэххх, как хочу я тебя найти.. и лопатой по башке В отместку получишь учебником. Таким черно-желтеньким, из серии "Файловая система для идиотов" :) Причем не по башке, а читать его заставлю. В последнем примере, ты правильно предсказываешь каким будет результат функции GetCurrentPath(). Но это правильное предсказание не согласуется с твоим заявлением от 22-го июля: SeraTJЕсли прога запускается из батника, то функция GetCurrentDirectory вернет папку, в которой лежит батник. Вывод, либо ты 22-го оговорилась, но не хочешь признаваться, либо наконец поняла что была не права, но по прежнему не хочешь признаваться :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2005, 23:54 |
|
||
|
Про GetModuleFileName
|
|||
|---|---|---|---|
|
#18+
Итак, сейчас я попробую тебе опять все объяснить. В этот раз использую математическую логику. Не знаю, знакома ли тебе такая наука. Вот эта фраза от 22 июля: SeraTJЕсли прога запускается из батника, то функция GetCurrentDirectory вернет папку, в которой лежит батник. - была сказана to redskin в ответ на: redskin GetCurrentDirectory возвращет не путь из которого запустили программу, а текущий каталог. Но обычно, после старта проги это одно и то же. Или интересуют как раз случаи, когда это не так? Итак, redskin привел утверждение: GetCurrentDirectory возвращает тот путь, где лежит exe. В ответ ему 22 июля я привожу контр-пример. Это такой гадкий случай, в котором утверждение/теорема/лемма перестает работать, а следовательно, это утверждение можно называть ложным. Для контр-примера достаточно одного самого специфичного случая. Я описала такой специфичный случай: SeraTJ Рассмотримбат-файл: C:\Go.bat : C:\path\path\myprog.exe Заходим в любой файловый менеждер (фар, проводник и т.д.) или просто командную строку dos в папку C:\. ЗДЕСЬ_ЗДЕСЬ запускаем go.bat. ТОГДА > CurrentDirectory(myprog) = "C:\"; Коротко это прозвучало как: "Если прога запускается из батника, то функция GetCurrentDirectory вернет папку, в которой лежит батник." Теперь вернемся к твоему комментарию: "Обманывать не хорошо". 1. Замечу главное: ты вырвал мою фразу из контекста. А фраза, вырванная из контекста, бывает полностью лишена смысла, а бывает так, что ее можно трактовать совершенно произвольным способом. 2. Моя фраза была бы неверной и некорректной, если бы в ней были кванторы "любой" или "всегда", а именно: "Всегда верно, что если прога запускается из любого батника, то функция GetCurrentDirectory вернет папку, в которой лежит батник." В таком варианте это утверждение неверно, что ты и пытаешься мне доказать. White Owl Вывод, либо ты 22-го оговорилась, но не хочешь признаваться, либо наконец поняла что была не права, но по прежнему не хочешь признаваться :) Вывод: 22-ого я не оговаривалась и привела приемлемый и допустимый пример. А вот твое "Обманывать не хорошо" было произнесено зря. Видимо, ты невнимательно читал предыдущие сообщения. Вобщем, жду извинений. SeraTJ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2005, 12:02 |
|
||
|
Про GetModuleFileName
|
|||
|---|---|---|---|
|
#18+
SeraTJИтак, сейчас я попробую тебе опять все объяснить. В этот раз использую математическую логику. Не знаю, знакома ли тебе такая наука.............Оно тебе надо ? Они ж издеваются просто, им скучно наверное, а ты .... -- Слово - серебро, а Молчание - золото Posted via ActualForum NNTP Server 1.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2005, 12:05 |
|
||
|
Про GetModuleFileName
|
|||
|---|---|---|---|
|
#18+
SeraTJ SeraTJЕсли прога запускается из батника, то функция GetCurrentDirectory вернет папку, в которой лежит батник. - была сказана to redskin в ответ на: redskin GetCurrentDirectory возвращет не путь из которого запустили программу, а текущий каталог. Но обычно, после старта проги это одно и то же. Или интересуют как раз случаи, когда это не так? redskin был прав на все сто процентов. Потому что путь из которого запустили программу и текущий каталог это разные вещи. Первое это сиюминутное состояние оболочки, а второе аттрибут процесса внутри операционной системы. Если программа запускается при помощи каких-либо более-менее стандартных оболочек (Проводник, FAR, command.com, cmd.exe, sh, csh, ksh, bash, etc.) Текущим каталогом при старте программы будет активный каталог оболочки. То есть тот путь из которого запустили программу. Это не зависит от операционной системы, а общее соглашение для всех оболочек. Обрати внимание, что это не правило, но традиция. Если же программа запускается из другой пользовательской программы, то вызывающая может дать вызываемой абсолютно любой каталог в качестве текущего. Для виндов смотри восьмой параметр функции CreateProcess(). Местонахождение вызывающих программ, будь это хоть батник, хоть скомпилированная в байт- или машинный код программа, никакого влияния на текущий каталог свежесозданного процесса не оказывает. SeraTJ1. Замечу главное: ты вырвал мою фразу из контекста. А фраза, вырванная из контекста, бывает полностью лишена смысла, а бывает так, что ее можно трактовать совершенно произвольным способом. Извини, но там не было контекста. Там была одна единственная фраза. Было бы лучше не упоминать о батниках вообще, а сказать о запуске программы по относительному или абсолютному пути. Это имело бы больший смысл в качестве ответа для redskin. Но проблема в том, что redskin был абсолютно прав. Зачем ты взялась давать ему ответ, тем более неверный я не знаю. SeraTJВывод: 22-ого я не оговаривалась и привела приемлемый и допустимый пример. А вот твое "Обманывать не хорошо" было произнесено зря. Видимо, ты невнимательно читал предыдущие сообщения. Вобщем, жду извинений. Извини, в следующий раз я буду читать тебе лекцию с самого начала. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2005, 19:07 |
|
||
|
Про GetModuleFileName
|
|||
|---|---|---|---|
|
#18+
redskin Или интересуют как раз случаи, когда это не так? я: Найдется такая оболочка в какой-нибудь ОС, найдется bat-файл, вызывающий программу А, ТАКОЙ, ЧТО если запустить его в этой оболочке, то запущенная программа А текущей папкой будет иметь папку, совпадающую с той, где лежит сам бат-файл, (ПРОДОЛЖАЮ ОТ ТЕБЯ) потому что эта оболочка установит для создаваемого процесса как current directory активную папку. Вот это "потому что" мне всегда было известно. В твоей лекции для меня не было ни грамма новой информации. Думаешь, я ни разу не создавала процесс и ни присваивала ему ЛЮБУЮ currentdirectory? Считаю, что это ты вредничаешь и жутко придираешься к словам. А спорить нам ну соооовсем нечего... Вобщем, не знала я, что на squ.ru присутствует профессорский состав и что нужно так следить за своими словами. Прошу прощения исключительно только за ваши душевные переживания по поводу прочитанного ;_) p.s. ненавижу, когда текстовые смайлики заменяются на картинки! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2005, 19:52 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33188879&tid=2032955]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
71ms |
get tp. blocked users: |
2ms |
| others: | 271ms |
| total: | 437ms |

| 0 / 0 |
