Функция открыть с помощью, получить адрес открываемого файла на С++ без консоли
Заканчиваю программу для мгновенного доступа к звуку по нажатию на клавишу.
Хочу чтоб по нажатию на файл сохраненного проекта, этот файл открывался в моей программе, но ка реализовать чтобы программа получила путь к файлу?
Если бы я не отключил консоль то можно было бы так и это был бы ответ,
int main(int count, char *arg[])
{
// arg[0] Адрес программы
// arg[1] то что нужно файл через который программа была открыта
// или адрес на то что пытались открыть с помощью этой параграммы
}
но я отключил консоль и через аргументы теперь это не реализуется.
консоль отключил с помощью следующих настроек.
так вот использую С++ оконная библиотека glfw с отключенной консолью открывать файл с помощью моей программы.
или хотя бы скажите как такая технология называется
Например раньше я не знал что перетаскивание файлов в окно называется Drag-and-drop, по этому поиск был сложен.
если кому надо будет. организовал так. Благодаря ответу.
std::string arg = GetCommandLineA();
std::vector<std::string> Masiv;
bool tumbler = 0;
std::string Stemp = "";
while(arg.size() > 0)
{
if(arg[0] == '"')
{
tumbler = !tumbler;
if(tumbler == 0)
{
Masiv.push_back(Stemp);
Stemp = "";
}
}
if(tumbler)
{
if(arg[0] != '"')
Stemp+=arg[0];
}
arg.erase(arg.begin()+0);
}
if(Masiv.size()>1)
Open(Masiv[1]);
Ответы (2 шт):
На Windows это делается через реестр (registry). В двух словах - регистрируется название программы, к этому значению привязывается команда, которая должна выполняться при открытии файла. Затем регистрируется расширение файла и к нему привязывается зарегистрированная программа.
Программно это можно сделать либо напрямую работая с windows API (или через библиотеку), либо же через какие-то программы - например, assoc.
Вручную это делается через свойства файла, или опять же прямо записывая значения в реестр через regedit.
Ключи в реестре
В HKEY_CURRENT_USER\Software\Classes\<расширение файла> регистрируется расширение. Там полно их, можно сделать по примеру существующих. Эта ветка реестра будет доступна только для текущего пользователя. Чтобы зарегистрировать для всех пользователей системы нужно использовать HKEY_LOCAL_MACHINE вместо HKEY_CURRENT_USER.
В HKEY_CURRENT_USER\Software\Classes\<название программы>\shell\open\command
нужно записать путь к исполняемому файлу и передать в него первый аргумент (открываемый файл). Например, так c:\app.exe "%1".
Затем создается ключ HKEY_CURRENT_USER\Software\Classes\<расширение файла>\OpenWithProgIds\<название программы> чтобы связать расширение с программой.
Если каких-то ключей нет, то их нужно создать.
Тут проблема в том, что при установке параметра Subsystem в "Windows" вид точки входа изменяется. Точка входа по умолчанию для приложения Win32 будет иметь такой вид:
INT WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, INT nCmdShow)
т.е. командная строка передается третьим параметром. Если вы устанавливаете Subsystem=Windows, но при этом принудительно задаете точку входа main, то аргументы будут обрабатываться неправильно. Лучше сделать так:
Сбросить параметр Entry point в значение по умолчанию
Вместо функции main создать в проекте функцию WinMain с указанным выше прототипом.
Тогда вы сможете получить доступ к переданным аргументам командной строки через параметр lpCmdLine, который является указателем на строку char* (если параметров несколько, вы можете разделить строку через strtok). Другой вариант - использовать функцию GetCommandLine, которая позволяет получить командную строку из любой функции.
