powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как взять путь из _TCHAR* argv[]
19 сообщений из 19, страница 1 из 1
Как взять путь из _TCHAR* argv[]
    #38480490
xlamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, я знаю, что много статей написано и тем разобрано по этой теме, но разобраться все же я не могу полностью. Вот есть код маленькой программки. В настройках проекта стоит использовать юникод.
Цель: необходимо в окошке сообщения получить путь до запускаемого файла.
По факту выходит строка с какой то бредятиной.

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

#include <windows.h>
#include <tchar.h>
int main(int argc, _TCHAR* argv[])
{
TCHAR* INSTALLDIR = argv[0];

MessageBox(NULL, INSTALLDIR, L"Proactive", MB_ICONINFORMATION | MB_OK);

return 0;
}

Помогите разобраться с этой проблемой пожалуйта.
...
Рейтинг: 0 / 0
Как взять путь из _TCHAR* argv[]
    #38480504
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xlamerЯ исхожу из того, что первым параметром будет полный путь до запускаемого
файла, причем без имени файла (на каком то форуме так объясняли)
Пойди на тот форум и плюнь в глаз тому, кто нёс такую чушь. Нулевым параметром идёт
имя исполняемого файла. Будет оно с путём или без - зависит от совсем других факторов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как взять путь из _TCHAR* argv[]
    #38480547
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дважды обманули. Он и не первым и не вторым параметром идёт.

Он вообще берётся из переменной окружения $PWD для Unix систем.

Для Windows это возможно функция GetCurrentDirectory
http://msdn.microsoft.com/en-us/library/windows/desktop/aa364934(v=vs.85).aspx
или еще какой грязный хак.
...
Рейтинг: 0 / 0
Как взять путь из _TCHAR* argv[]
    #38480557
xlamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тогда вопрос немного меняется. Есть код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
#include <windows.h>
#include <tchar.h>
int main(int argc, _TCHAR* argv[])
{
	int pp[3];
	char p1[300],p2[300],*p3,ExePath[300];
	HMODULE hInst;
 
	hInst=GetModuleHandle(NULL);
	GetModuleFileName(hInst,p1,sizeof(p1));
	GetFullPathName(p1,sizeof(p2),p2,&p3);
	pp[1]=lstrlen(p2);
	pp[2]=lstrlen(p3);
	pp[0]=pp[1]-pp[2]+1;
	lstrcpyn(ExePath,p2,pp[0]);

	MessageBox(NULL, ExePath, "Window", MB_ICONINFORMATION | MB_OK);
	
	return 0;
}



Он работает при указании использовать многобайтную кодировку, то есть выдает путь в сообщении именно так, как мне нужно. Как сделать, чтобы этот код работал в под Юникод кодировкой? Знаю, что в tchar.h должны быть макросы для функций, применяющиеся здесь, но я не нашел их.
...
Рейтинг: 0 / 0
Как взять путь из _TCHAR* argv[]
    #38480587
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А попробуй ради прикола #define _UNICODE
...
Рейтинг: 0 / 0
Как взять путь из _TCHAR* argv[]
    #38480614
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xlamer,

Если у тебя UNICODE приложение, то какого фига ты везде работаешь с char ?
...
Рейтинг: 0 / 0
Как взять путь из _TCHAR* argv[]
    #38480617
xlamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я наверно не полностью объяснил. В настройках проекта уже изменен параметр Набор знаков на значение Использовать Юникод кодировку. Соответственно выдается куча ошибок:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
c:\documents and settings\owner\my documents\visual studio 2008\projects\test2\test2\mainunit.cpp(14) : error C2664: GetModuleFileNameW: невозможно преобразовать параметр 2 из 'char [300]' в 'LPWSTR'
        Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
c:\documents and settings\owner\my documents\visual studio 2008\projects\test2\test2\mainunit.cpp(15) : error C2664: GetFullPathNameW: невозможно преобразовать параметр 1 из 'char [300]' в 'LPCWSTR'
        Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
c:\documents and settings\owner\my documents\visual studio 2008\projects\test2\test2\mainunit.cpp(16) : error C2664: lstrlenW: невозможно преобразовать параметр 1 из 'char [300]' в 'LPCWSTR'
        Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
c:\documents and settings\owner\my documents\visual studio 2008\projects\test2\test2\mainunit.cpp(17) : error C2664: lstrlenW: невозможно преобразовать параметр 1 из 'char *' в 'LPCWSTR'
        Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
c:\documents and settings\owner\my documents\visual studio 2008\projects\test2\test2\mainunit.cpp(19) : error C2664: lstrcpynW: невозможно преобразовать параметр 1 из 'char [300]' в 'LPWSTR'
        Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
c:\documents and settings\owner\my documents\visual studio 2008\projects\test2\test2\mainunit.cpp(21) : error C2664: MessageBoxW: невозможно преобразовать параметр 2 из 'char [300]' в 'LPCWSTR'
        Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции



А функция GetCurrentDirectory, насколько я знаю, сообщает о текущей директории для программы, которая может быть любой, поэтому я ее не использую.
...
Рейтинг: 0 / 0
Как взять путь из _TCHAR* argv[]
    #38480619
xlamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ты просто загляни в заголовочные файлы. Как определена функция.
...
Рейтинг: 0 / 0
Как взять путь из _TCHAR* argv[]
    #38480627
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xlamer,

Ну так странно что ты это тоже заметил, но спрашиваешь, почему же приложение, написанное не в юникоде, в юникоде таки не работает.
...
Рейтинг: 0 / 0
Как взять путь из _TCHAR* argv[]
    #38480660
xlamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Перед тем как создать тему я прочел вот эту статью . Но у меня не хватает знания и опыта в C++, чтобы нормально все это осуществить в конкретном примере.

MasterZivно спрашиваешь, почему же приложение, написанное не в юникоде, в юникоде таки не работает

Я понимаю, почему происходят ошибки и, где вы, MasterZiv, в предложении Как сделать, чтобы этот код работал в под Юникод кодировкой? увидели вопрос отчего же это все происходит?
...
Рейтинг: 0 / 0
Как взять путь из _TCHAR* argv[]
    #38480673
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xlamer,

Ответ очевиден — переписать все на использование юникод символов, или переписать на TCHAR .

Все переменные char заменить на TCHAR,
Все функции lstr* заменить на соответствующие _tcs* .
...
Рейтинг: 0 / 0
Как взять путь из _TCHAR* argv[]
    #38480995
xlamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Переделал:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
#include <windows.h>
#include <tchar.h>

int main(int argc, _TCHAR* argv[])
{
	int pp[3];
	_TCHAR p1[300],p2[300],*p3,ExePath[300];
	HMODULE hInst;
 
	hInst=GetModuleHandle(NULL);
	GetModuleFileName(hInst,p1,sizeof(p1));
	GetFullPathName(p1,sizeof(p2),p2,&p3);
	pp[1]=_tcslen(p2);
	pp[2]=_tcslen(p3);
	pp[0]=pp[1]-pp[2]+1;
	lstrcpyn(ExePath,p2,pp[0]);
	
	MessageBox(NULL, ExePath, L"Window", MB_ICONINFORMATION | MB_OK);
	
	return 0;
}



Путь выводит, но потом сообщается следующая ошибка:

Код: plaintext
1.
Run-Time Check Failure #2 - Stack around the variable 'p2' was corrupted.



И, как я понимаю, вместо L"Window" нужно поставить T"Window", но T никак не распознается. И еще вместо lstrcpyn здесь советуют воспользоваться
StringCchCopy (buffer, src, sizeof (buffer)/sizeof (buffer [0])
...
Рейтинг: 0 / 0
Как взять путь из _TCHAR* argv[]
    #38481002
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xlamer,
А

lstrcpyn

почему оставил?

tcsncpy

L"xxx" лучше заменять на _T("xxx"),
но L"" работать должен.
...
Рейтинг: 0 / 0
Как взять путь из _TCHAR* argv[]
    #38481012
xlamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На tcsncpy выдает идентификатор не найден. Может надо что то еще подключить?
Написал _tcsncpy, выдает то что на картинке. А потом опять

Код: plaintext
1.
Run-Time Check Failure #2 - Stack around the variable 'p2' was corrupted.
...
Рейтинг: 0 / 0
Как взять путь из _TCHAR* argv[]
    #38481013
xlamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И _T у меня необъявленный идентификатор. Я работаю в VS 2008, может это имеет значение.
...
Рейтинг: 0 / 0
Как взять путь из _TCHAR* argv[]
    #38481044
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
#define UNICODE
#include <windows.h>

using namespace std;

int main()
{
	TCHAR ExePath[300];
	for(TCHAR *p=ExePath + GetModuleFileName(NULL,ExePath,sizeof(ExePath)/sizeof(ExePath[0])) - 1; *p != TEXT('\\');p--)
	{
	    *p=0;
	}

	MessageBox(NULL, ExePath, TEXT("Window"), MB_ICONINFORMATION | MB_OK);

	return 0;
}
...
Рейтинг: 0 / 0
Как взять путь из _TCHAR* argv[]
    #38481725
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xlamerНа tcsncpy выдает идентификатор не найден. Может надо что то еще подключить?
Написал _tcsncpy, выдает то что на картинке. А потом опять

Код: plaintext
1.
Run-Time Check Failure #2 - Stack around the variable 'p2' was corrupted.



По Generic-Text Mappings читать тут в общем,

http://msdn.microsoft.com/en-us/library/vstudio/szdfzttz(v=vs.110).aspx

и тут -- конкретно про _tcsncpy

http://msdn.microsoft.com/en-us/library/vstudio/tsbaswba(v=vs.110).aspx
...
Рейтинг: 0 / 0
Как взять путь из _TCHAR* argv[]
    #38482089
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xlamer,

ну чё, разобрался ?
...
Рейтинг: 0 / 0
Как взять путь из _TCHAR* argv[]
    #38482464
xlamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, спасибо большое всем присутствующим. Код от m_Sla рабочий, мне подходит и выглядит более профессионально чем мой, за что ему отдельная благодарность.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как взять путь из _TCHAR* argv[]
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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