Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.03.2016, 04:59   #1
Girei
Пользователь
 
Аватар для Girei
 
Регистрация: 22.10.2013
Сообщений: 72
Злость Получить директорию программы

Ситуация следующая. Имеется программа MFC VC++
Мне нужно узнать директорию, из которой она запущена и создать в этой директории папку (если уже не создана).
Нарулил код
Код:
	char CD[FILENAME_MAX];
	_getcwd(CD, sizeof(CD));
Но, с char мне не очень удобно работать. Кроме того, почитал, что она не всегда даёт корректный вывод.
Пробовал сделать так
Код:
	LPTSTR Buff[MAX_PATH];
	GetModuleFileName(NULL,Buff,Sizeof(Buff));
Или так (нашёл решение в сети, тоже не работает)
Код:
        wchar_t Buff[MAX_PATH];
Ругается на несовпадение типов.
После того, как вытащу папку, хотелось бы использовать PathRemoveFileSpec, чтобы отделить путь и добавить к нему название (оно не меняется никогда). Как такое сделать?
Girei вне форума Ответить с цитированием
Старый 08.03.2016, 07:41   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Цитата:
Мне нужно узнать директорию, из которой она запущена и создать в этой директории папку (если уже не создана).
Для относительных путей не нужно получать путь...
p51x вне форума Ответить с цитированием
Старый 08.03.2016, 08:57   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Для относительных путей не нужно получать путь...
Не нужно. Если есть 100% уверенность в том, что рабочий каталог совпадает с каталогом программы. А он совсем не обязан совпадать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.03.2016, 09:06   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

По-моему, если программа что-то хочет писать, то и должна писать в рабочий каталог или профиль пользователя. Тем более, что на современных ОС вам скорее просто не позволят писать в католог установки.
p51x вне форума Ответить с цитированием
Старый 08.03.2016, 13:50   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

argv[0]
ликбез.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 09.03.2016, 06:35   #6
Girei
Пользователь
 
Аватар для Girei
 
Регистрация: 22.10.2013
Сообщений: 72
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
argv[0]
ликбез.
С этим разобрался. Там всё несколько проще было. Сразу же после подъехали классы.
Суть следующая: Я получил директорию программы в одном файле, мне надо передать её в дугой.
Задал переменную opatch типа public в классе CMFCApplication1App файла Application1App.cpp, провёл с ней манипуляции. Затем, пытаюсь обратиться к ней из файла MFCApplication1Dlg.cpp примерно таким образом:
Код:
extern CString opath;
На выходе получаю кукиш и ошибку линковщика:
Код:
MFCApplication1Dlg.obj : error LNK2001: неразрешенный внешний символ ""class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > > opath" (?opath@@3V?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@A)"
Ничего вразумительного для себя найти в гугле не смог.
Пытался обратится напрямую.
Код:
CMFCApplication1App::opath;
Получаю следующее:
Код:
error C2597: недопустимая ссылка на нестатический член "CMFCApplication1App::opath"
В классах не силён, а разбираться самостоятельно уже просто не в состоянии.
Girei вне форума Ответить с цитированием
Старый 09.03.2016, 08:08   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Это не в классах проблема. extern условно говорит компилятору, что эта переменная определена где-то в другом месте. Так где она у вас определена? Вы где-нибудь ее описали без extern?

Цитата:
Пытался обратится напрямую.
...
Получаю следующее:
Ну так же незя. Либо статической делайте, либо обращайтесь через объект.
p51x вне форума Ответить с цитированием
Старый 09.03.2016, 08:43   #8
Girei
Пользователь
 
Аватар для Girei
 
Регистрация: 22.10.2013
Сообщений: 72
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Это не в классах проблема. extern условно говорит компилятору, что эта переменная определена где-то в другом месте. Так где она у вас определена? Вы где-нибудь ее описали без extern?


Ну так же незя. Либо статической делайте, либо обращайтесь через объект.
Ну, конечно,она объявлена без extern. С помощью мастера классов. Если я в объявлении пишу static - опять не доволен. И разве static не для того, чтобы переменную как раз НЕ было видно?
Каким образом обращаться через объект? Можно пример? Голова закипела уже к утру(
Girei вне форума Ответить с цитированием
Старый 09.03.2016, 08:56   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Цитата:
Ну, конечно,она объявлена без extern. С помощью мастера классов.
Объявлена где? В какой единице трансляции? Как подключается в другие?

Цитата:
Если я в объявлении пишу static - опять не доволен.
Просто хмурится или что-то пишет?

Цитата:
И разве static не для того, чтобы переменную как раз НЕ было видно?
статик он не так прост - http://rsdn.ru/forum/info/FAQ.cpp.static

Цитата:
Каким образом обращаться через объект? Можно пример?
Как обычно: a.variable
p51x вне форума Ответить с цитированием
Старый 09.03.2016, 09:15   #10
Girei
Пользователь
 
Аватар для Girei
 
Регистрация: 22.10.2013
Сообщений: 72
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Объявлена где? В какой единице трансляции? Как подключается в другие?


Просто хмурится или что-то пишет?


статик он не так прост - http://rsdn.ru/forum/info/FAQ.cpp.static


Как обычно: a.variable
Вот тут MFC объявляет класс, там и переменная
Код:
class CMFCApplication1App : public CWinApp
{
public:
	CMFCApplication1App();
	
// Переопределение
public:
	virtual BOOL InitInstance();
	
// Реализация

	DECLARE_MESSAGE_MAP()
	afx_msg void On32771();
//	afx_msg void On32774();
//	afx_msg void On32774();
	afx_msg void OnAbout();

	CString opath;
};
Это пишет, если добавить static при объявлении
Код:
1>MFCApplication1.obj : error LNK2001: неразрешенный внешний символ ""protected: static class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > > CMFCApplication1App::opath" (?opath@CMFCApplication1App@@1V?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@A)"
1>MFCApplication1Dlg.obj : error LNK2001: неразрешенный внешний символ ""class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > > opath" (?opath@@3V?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@A)"
В душе понимаю, что через :: обращаться нельзя, но не понимаю, почему

Виноват, это было было упоминание в .h
В этот же .cpp
Код:
opath = _T("")

Последний раз редактировалось Girei; 09.03.2016 в 09:49.
Girei вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Qt узнать директорию SAMOUCHKA Qt и кроссплатформенное программирование С/С++ 5 05.03.2016 17:13
Работа с файлами и директориями. Как копировать директорию с ее содержимым в другую директорию??? Дмитрий_Попов Общие вопросы C/C++ 1 14.12.2011 21:49
Как преобразовать директорию kettanaito Общие вопросы Delphi 5 13.10.2011 17:19
Вывести директорию Progs1024 Общие вопросы Delphi 2 21.11.2009 16:38
Запаролить директорию NikLik Win Api 2 17.02.2008 10:46