C++ Builder - char* в string
Ситуация такова - надергал по кускам код из Сети, выводит в сообщении имя собственного исполняемого файла :
Код:
WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
lpCmdLine = GetCommandLine();
char *ThisMyName = &lpCmdLine[0];
MessageBox(0,ThisMyName,"exe", MB_OK);
return 0;
}
{
lpCmdLine = GetCommandLine();
char *ThisMyName = &lpCmdLine[0];
MessageBox(0,ThisMyName,"exe", MB_OK);
return 0;
}
1. Во первых что за жесть происходит с указателями? На мой замыленный взгляд, указателю на переменную типа char передается некий адрес в памяти, который в дальнейшем уходит в MessageBox. Так каким образом MessageBox выводит целую строку, если в качестве аргумента ему передается адрес на переменную типа char?
2. Что значит &lpCmdLine[0];, а именно знак амперсанда?
3. Коим образом мне чудо значение char *ThisMyName, привести в тип строки (string или char)?
Дело в том, что мне нужно получить именно имя файла, а мой маленький код выводит полный путь. Учитывая, что я в упор не понимаю, что есть char *ThisMyName, я не могу его распарсить.
Заранее спасибо.
Код:
#include <windows.h>
#include <cstring>
#include <string>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
//Вспомогательные переменные
//char *buffer;//Для buffer = &lpCmdLine[0];
char buffer[MAX_PATH];//Для GetModuleFileName и для std::strcpy
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
//Получаем полный путь
lpCmdLine = GetCommandLine();// стр1
//амперсанд - оператор взятия адреса объекта
//таким образом указатель на char будет содержать
//адрес первого элемента массива lpCmdLine
//Собственно ThisMyName - есть строка в стиле Си,
//признаком ее завершения является \0
//buffer = &lpCmdLine[0];
//Мжно копировать так:
std::strcpy (buffer, lpCmdLine);//cstring стр2
//Или второй способ получения полного пути (закомментировать стр1 и стр2)
//// GetModuleFileName(hInstance,buffer,MAX_PATH);
//Разделяем полный путь на составляющие
_splitpath( buffer, drive, dir, fname, ext );//stdlib.h
//Можно использовать строки
std::string str_fname (fname);
std::string str_ext (ext);
std::string str_full = str_fname + str_ext;
//MessageBox(
//"дескриптор родительского окна",
//"текст сообщения",
//"заголовок окна сообщения",
//"характер окна сообщения")
MessageBox(0,str_full.c_str(),"exe", MB_OK);
return 0;
}
#include <cstring>
#include <string>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
//Вспомогательные переменные
//char *buffer;//Для buffer = &lpCmdLine[0];
char buffer[MAX_PATH];//Для GetModuleFileName и для std::strcpy
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
//Получаем полный путь
lpCmdLine = GetCommandLine();// стр1
//амперсанд - оператор взятия адреса объекта
//таким образом указатель на char будет содержать
//адрес первого элемента массива lpCmdLine
//Собственно ThisMyName - есть строка в стиле Си,
//признаком ее завершения является \0
//buffer = &lpCmdLine[0];
//Мжно копировать так:
std::strcpy (buffer, lpCmdLine);//cstring стр2
//Или второй способ получения полного пути (закомментировать стр1 и стр2)
//// GetModuleFileName(hInstance,buffer,MAX_PATH);
//Разделяем полный путь на составляющие
_splitpath( buffer, drive, dir, fname, ext );//stdlib.h
//Можно использовать строки
std::string str_fname (fname);
std::string str_ext (ext);
std::string str_full = str_fname + str_ext;
//MessageBox(
//"дескриптор родительского окна",
//"текст сообщения",
//"заголовок окна сообщения",
//"характер окна сообщения")
MessageBox(0,str_full.c_str(),"exe", MB_OK);
return 0;
}
НУЖНО использовать строки.
Использовать строки в С-стиле тут нет никакой необходимости.
Перечитал и понял, что нужно именно имя файла, а не полный путь. Тогда PathFindFileName в помощь.
По поводу
Код:
char *ThisMyName=&lpCmdLine[0];
Код:
char *ThisMyName=lpCmdLine;
Код:
#include <string>
char *szFullPath;
string sFileName;
…
sFileName=PathFindFileName(szFullPath);
char *szFullPath;
string sFileName;
…
sFileName=PathFindFileName(szFullPath);