ifstream — Корень приложения C ++ при использовании пользовательского протокола

Я создал приложение C ++ для Windows, которое запускается по специальному протоколу, используя следующую технику: http://msdn.microsoft.com/en-us/library/ie/aa767914(v=vs.85).aspx.

Он загружает файл конфигурации с использованием ifstream, который находится в той же папке, что и исполняемый файл. Так что, если я использую относительный путь (ifstream myfile ("config.cfg");) Отлично работает. Но если я вызываю свое приложение, используя собственный протокол в IE, вот так: myprotocol:\\ он не может загрузить файл, пока я выполняю тот же исполняемый файл.

Может ли кто-нибудь объяснить мне, почему моя программа ведет себя по-разному при выполнении через собственный протокол и что мне нужно сделать, чтобы приложение загружало файл без использования абсолютного пути?

int main(int argc, char* argv[])
{
wchar_t buffer[MAX_PATH];
GetModuleFileName( NULL, buffer, MAX_PATH );
std::wcout << buffer;

std::string line;
std::ifstream file ("config.cfg);
if(file.is_open())
{
std::cout << "Succes";
}
else
{
std::cout << "Could not load file";
return -1;
}
return 0;
}

GetModuleFileName правильно дает путь к исполняемому файлу в обоих случаях. Это был просто маленький тест.

Любая помощь приветствуется,
Александр

1

Решение

Вы ошибочно полагаете, что приложение вызывается из папки, в которой оно находится.

Вам нужно будет получить путь к текущему приложению, а затем объединить его с именем файла конфигурации. Например:

char buffer[MAX_PATH];
GetModuleFileNameA( NULL, buffer, MAX_PATH );
PathRemoveFileSpecA(buffer);
char cfg_path[MAX_PATH];
PathCombineA(cfg_path, MAX_PATH, buffer, "config.cfg");
// cfg_path now contains the full path to the config file

Альтернативное решение — передать путь к файлу конфигурации в качестве первого аргумента приложения. Это будет означать изменение команды в реестре на что-то вроде "C:\Program Files\MyProtocol\MyProtocol.exe" "C:\Program Files\MyProtocol\config.cfg" "%1", Затем код можно изменить на следующее:

int main(int argc, char* argv[]) {
if( argc<2 ) return -1;

std::ifstream file(argv[1]);
// ...
}
1

Другие решения

Других решений пока нет …