powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Про GetModuleFileName
23 сообщений из 23, страница 1 из 1
Про GetModuleFileName
    #33179769
Здравствуйте, возникла такая проблема- есть вот такой кусочек кода:

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 из начала строки.
Так вот вопрос, почему эта ошибка возникает? (я у себя переименовал этот файл написав имя верхнем регистре, все равно программа работает)
...
Рейтинг: 0 / 0
Про GetModuleFileName
    #33179982
SeraTJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну. Если уж нравится так извращаться, то
перед delete добать path.MakeLower();


А вообще можно исп. winapi функции:
Код: plaintext
1.
2.
3.
4.
5.
6.
char lp[ 1000 ];
GetModuleFileName(GetModuleHandle(NULL), lp,  1000  );
PathRemoveFileSpec(lp);
lstrcat(lp, "/data/stat.dat");

statFilePath=lp;

а можно еще по-другому.......
...
Рейтинг: 0 / 0
Про GetModuleFileName
    #33180024
redskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чем не нравится функция GetCurrentDirectory ?
Делает почти то, что надо.
Она, правда, возвращет не путь из которого запустили программу, а текущий каталог. Но обычно, после старта проги это одно и то же. Или интересуют как раз случаи, когда это не так?
...
Рейтинг: 0 / 0
Про GetModuleFileName
    #33180071
SeraTJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хе. Вот тебе пример.
Если прога запускается из батника, то функция GetCurrentDirectory вернет папку, в которой лежит батник.
...
Рейтинг: 0 / 0
Про GetModuleFileName
    #33180084
redskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeraTJХе. Вот тебе пример.
Если прога запускается из батника, то функция GetCurrentDirectory вернет папку, в которой лежит батник.

Да я знаю
И если запускать через ярлык, то в параметрах тоже можно явно другой каталог указать... Но вдруг у автора ситуация попроще :)
...
Рейтинг: 0 / 0
Про GetModuleFileName
    #33180176
Дело в том, что ситуация, когда запускается через ярлык вполне возможна.
Спасибо за советы.
Интересно было-бы узнать, чем все-таки обусловлен такой частный случай на одной отдельно взятой машине
...
Рейтинг: 0 / 0
Про GetModuleFileName
    #33180787
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeraTJХе. Вот тебе пример.
Если прога запускается из батника, то функция GetCurrentDirectory вернет папку, в которой лежит батник.
Обманывать не хорошо.

СтудентищеИнтересно было-бы узнать, чем все-таки обусловлен такой частный случай на одной отдельно взятой машине
Две самые частые проблемы с путями это: Разные файловые системы (NTFS, FAT, FAT32, сетевой каталог или вообще экзотика какая-нибудь). На разных машинах могут быть установлены разные локали.
В данном случае, наиболее правильно будет использовать GetModuleFileName() потом искать последние вхождение слэша в строку и обрубать строку по нему.
Использовать CString.Find() - верный путь к проблемам. А вдруг юзер поименует каталог твоей программы на основе имени твоей программы, а? :)
...
Рейтинг: 0 / 0
Про GetModuleFileName
    #33180965
SeraTJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl SeraTJХе. Вот тебе пример.
Если прога запускается из батника, то функция GetCurrentDirectory вернет папку, в которой лежит батник.
Обманывать не хорошо.



"Обманывать не хорошо." - Это, простите, кому адресуется?
...
Рейтинг: 0 / 0
Про GetModuleFileName
    #33181032
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeraTJ White Owl SeraTJХе. Вот тебе пример.
Если прога запускается из батника, то функция GetCurrentDirectory вернет папку, в которой лежит батник.
Обманывать не хорошо.

"Обманывать не хорошо." - Это, простите, кому адресуется?
Тому, кто сказал что если программа запускается из батника, то функция GetCurrentDirectory вернет папку, в которой лежит батник.
На текущий каталог программы местонахождение батника влияния не оказывает совершенно.
...
Рейтинг: 0 / 0
Про GetModuleFileName
    #33182462
SeraTJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
Тому, кто сказал что если программа запускается из батника, то функция GetCurrentDirectory вернет папку, в которой лежит батник.
На текущий каталог программы местонахождение батника влияния не оказывает совершенно.

мда... тяжелый случай.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
#include <iostream>
int main()
{
  char szBuffer[MAX_PATH];
  GetCurrentDirectory(MAX_PATH, szBuffer);
   std::cout << szBuffer << std::endl;
  return  0 ;
}

На! Запусти ее непосредственно.
Затем в другой папке создай
go.bat:
path\program.exe
и полюбуйся.

И не надо вылезать со своими "обманывать не хорошо", если сам ничего не знаешь.
...
Рейтинг: 0 / 0
Про GetModuleFileName
    #33183669
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeraTJ
Затем в другой папке создай
go.bat:
path\program.exe
и полюбуйся.
И не надо вылезать со своими "обманывать не хорошо", если сам ничего не знаешь.
Ой плачу не могу. Лапочка, ты как свой батник запускаешь? В Проводнике мышкой щелкаешь? А теперь сделай ярлычок для своего батника, положи ярлычок на рабочий стол и запусти через ярлычок. Посмотри на вывод свой программы.
А теперь пойди в свойства свежесозданного ярлычка и поправь там поле "Start In" на что-нибудь. Запусти еще раз. Удивись.
А можешь поправь свой батник чтобы он был вида:
Код: plaintext
1.
cd \somepath
\someotherpath\program.exe
Запусти и удивись еще раз.
...
Рейтинг: 0 / 0
Про GetModuleFileName
    #33183706
SeraTJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не понимаю Ваших наездов и брызгов, многоуважаемый лапочка!

Прошу прочесть еще раз содержимое этого топика, только повнимательнее, пожалуйста. Товарища "redskin"-а интересовали случаи, когда функция GetCurrentDirectory вернет папку, отличную от той, в которой находится exe. Я привела пример.
А придумать способы, как запустить программу так, чтобы текущая директория была директорией программы нечего делать, Вы только что мне эти способы нашли (ничего нового для меня не было, замечу).
Btw, батничек я запускаю из far-a. Люблю, знаете ли эту программу.

С уважением, SeraTJ.
...
Рейтинг: 0 / 0
Про GetModuleFileName
    #33183717
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeraTJЯ привела пример.
Некорректный и не соотвествующий действительности.

Каждая программа имеет свой текущий каталог. Каким он будет в момент старта программы решает программа запускающая нашу. Для случая FAR это всегда тот каталог который открыт на панельке. Местонахождение батника к текущему каталогу программы запускаемой из батника отношения не имеет.
...
Рейтинг: 0 / 0
Про GetModuleFileName
    #33184414
SeraTJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
Некорректный и не соотвествующий действительности.


Опять не соглашусь. Как контр-пример мой пример был вполне допустимым.

Пусть содержимое бат-файла:
C:\path\path\myprog.exe,
сам бат-файл в папке С:\.
Если запустить bat из своей папки, то любой файловый менеждер (фар, проводник и т.д.) или просто командная строка dos установит текущим каталогом программы С:\ -- то есть папку, в которой лежит сам батник или, говоря другими словами, папку, откуда запустили этот бат-файл. Елки.

Мой пример можно назвать некорректным, только если очень-очень-очень сильно придираться к словам.

К тому же для меня было главным показать, что в данном случае НЕЛЬЗЯ использовать GetCurrentDirectory. Может, я не очень хорошо выразилась, но, думаю, все, кроме вас, меня поняли.
Все, достал уже этот бесполезный спор. Тем более на фоне такого:
Код: plaintext
1.
2.
3.
4.
5.
6.
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";
Это ж кошмар.... это ж так на php или на basic-е можно наляпать... аааааа
...
Рейтинг: 0 / 0
Про GetModuleFileName
    #33184423
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, никто не сказал, что КурренДир может меняться в программке-то ... так что если ты хочешь быть уверен, что берешь файл из каталога c:\prog\ то надо его вычислять из полного пути запускаемого файла.

--
With best regards, Karabas Barabas
Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Про GetModuleFileName
    #33184585
SeraTJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вобщем-то, про это я и говорю, что использовать GetCurrentDir нельзя, нужно использовать путь запускаемого файла.
:)
...
Рейтинг: 0 / 0
Про GetModuleFileName
    #33187761
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeraTJПусть содержимое бат-файла:
C:\path\path\myprog.exe,
сам бат-файл в папке С:\.
Если запустить bat из своей папки, то любой файловый менеждер (фар, проводник и т.д.) или просто командная строка dos установит текущим каталогом программы С:\ -- то есть папку, в которой лежит сам батник или, говоря другими словами, папку, откуда запустили этот бат-файл. Елки.
Нет, не установит. :)
Текущим каталогом останется та самая "своя папка".
Вот есть у тебя батник C:\Go.bat с показаным содержимым? Перейди в каталог C:\path и дай команду \Go.bat , текущим каталогом останется \path.
...
Рейтинг: 0 / 0
Про GetModuleFileName
    #33187860
SeraTJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
эххх, как хочу я тебя найти..
и лопатой по башке
.... ))))))) ладно, поменьше лирики


Люди добрые! ну, кто-нибудь, вступитесь за меня. ну, что он пристал????



Так, White Owl-придира, слушай сюда. Ты опять неправильно понял то, что я сказала.
Сейчас я ЕЩЕ РАЗ повторю последнюю фразу, которую ты прокомментировал, исправлю неточности.
Я тебя умоляю, прочитай ее внимательно, а не через строчку...
И Если ты опять не согласишься --- ПИШИ сюда. Я ХОЧУ ЗНАТЬ, В ЧЕМ Я НЕПРАВА.

Рассмотрим бат-файл: C:\Go.bat :

Код: plaintext
C:\path\path\myprog.exe

Заходим в любой файловый менеждер (фар, проводник и т.д.) или просто командную строку dos в папку C:\. ЗДЕСЬ_ЗДЕСЬ запускаем go.bat.
ТОГДА > CurrentDirectory(myprog) = "C:\";

cd path
-- переходим в папку c:\path
Выполняем команду:
..\go.bat
ТОГДА > CurrentDirectory(myprog) = "C:\path";
...
Рейтинг: 0 / 0
Про GetModuleFileName
    #33188040
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeraTJэххх, как хочу я тебя найти.. и лопатой по башке
В отместку получишь учебником. Таким черно-желтеньким, из серии "Файловая система для идиотов" :) Причем не по башке, а читать его заставлю.

В последнем примере, ты правильно предсказываешь каким будет результат функции GetCurrentPath(). Но это правильное предсказание не согласуется с твоим заявлением от 22-го июля:
SeraTJЕсли прога запускается из батника, то функция GetCurrentDirectory вернет папку, в которой лежит батник.
Вывод, либо ты 22-го оговорилась, но не хочешь признаваться, либо наконец поняла что была не права, но по прежнему не хочешь признаваться :)
...
Рейтинг: 0 / 0
Про GetModuleFileName
    #33188879
SeraTJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итак, сейчас я попробую тебе опять все объяснить. В этот раз использую математическую логику. Не знаю, знакома ли тебе такая наука.

Вот эта фраза от 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
...
Рейтинг: 0 / 0
Про GetModuleFileName
    #33188895
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeraTJИтак, сейчас я попробую тебе опять все объяснить. В этот раз использую математическую логику. Не знаю, знакома ли тебе такая наука.............Оно тебе надо ? Они ж издеваются просто, им скучно наверное, а ты ....

--
Слово - серебро, а Молчание - золото
Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Про GetModuleFileName
    #33190334
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeraTJ SeraTJЕсли прога запускается из батника, то функция GetCurrentDirectory вернет папку, в которой лежит батник.
- была сказана to redskin в ответ на:
redskin
GetCurrentDirectory возвращет не путь из которого запустили программу, а текущий каталог. Но обычно, после старта проги это одно и то же. Или интересуют как раз случаи, когда это не так?

redskin был прав на все сто процентов. Потому что путь из которого запустили программу и текущий каталог это разные вещи. Первое это сиюминутное состояние оболочки, а второе аттрибут процесса внутри операционной системы.

Если программа запускается при помощи каких-либо более-менее стандартных оболочек (Проводник, FAR, command.com, cmd.exe, sh, csh, ksh, bash, etc.) Текущим каталогом при старте программы будет активный каталог оболочки. То есть тот путь из которого запустили программу. Это не зависит от операционной системы, а общее соглашение для всех оболочек. Обрати внимание, что это не правило, но традиция.
Если же программа запускается из другой пользовательской программы, то вызывающая может дать вызываемой абсолютно любой каталог в качестве текущего. Для виндов смотри восьмой параметр функции CreateProcess().
Местонахождение вызывающих программ, будь это хоть батник, хоть скомпилированная в байт- или машинный код программа, никакого влияния на текущий каталог свежесозданного процесса не оказывает.

SeraTJ1. Замечу главное: ты вырвал мою фразу из контекста. А фраза, вырванная из контекста, бывает полностью лишена смысла, а бывает так, что ее можно трактовать совершенно произвольным способом.
Извини, но там не было контекста. Там была одна единственная фраза.
Было бы лучше не упоминать о батниках вообще, а сказать о запуске программы по относительному или абсолютному пути. Это имело бы больший смысл в качестве ответа для redskin. Но проблема в том, что redskin был абсолютно прав. Зачем ты взялась давать ему ответ, тем более неверный я не знаю.

SeraTJВывод: 22-ого я не оговаривалась и привела приемлемый и допустимый пример.
А вот твое "Обманывать не хорошо" было произнесено зря. Видимо, ты невнимательно читал предыдущие сообщения. Вобщем, жду извинений.
Извини, в следующий раз я буду читать тебе лекцию с самого начала.
...
Рейтинг: 0 / 0
Про GetModuleFileName
    #33190376
SeraTJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
redskin Или интересуют как раз случаи, когда это не так?

я:
Найдется такая оболочка в какой-нибудь ОС, найдется bat-файл, вызывающий программу А, ТАКОЙ, ЧТО если запустить его в этой оболочке, то запущенная программа А текущей папкой будет иметь папку, совпадающую с той, где лежит сам бат-файл, (ПРОДОЛЖАЮ ОТ ТЕБЯ) потому что эта оболочка установит для создаваемого процесса как current directory активную папку.

Вот это "потому что" мне всегда было известно. В твоей лекции для меня не было ни грамма новой информации. Думаешь, я ни разу не создавала процесс и ни присваивала ему ЛЮБУЮ currentdirectory?

Считаю, что это ты вредничаешь и жутко придираешься к словам. А спорить нам ну соооовсем нечего...

Вобщем, не знала я, что на squ.ru присутствует профессорский состав и что нужно так следить за своими словами. Прошу прощения исключительно только за ваши душевные переживания по поводу прочитанного ;_)

p.s. ненавижу, когда текстовые смайлики заменяются на картинки!
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Про GetModuleFileName
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]