Как включить перетаскивание файла на *.exe и получить его в качестве параметра?
что мне нужно сделать, чтобы моя программа использовала файл, который был перетащен на его значок в качестве параметра?
мой main
способ выглядит так:
int main(int argc, char* argv[])
{
if (argc != 2) {
cout << "ERROR: Wrong amount of arguments!" << endl;
cout << "n" << "Programm closed...nn" << endl;
exit(1);
return 0;
}
Converter a(argv[1]);
// ...
cout << "n" << "Programm finished...nn" << endl;
// cin.ignore();
return 0;
}
что я действительно хотел бы сделать, это выбрать 10 (или около того) файлов, поместить их в EXE и обработать их из моего приложения.
EDIT:
параметр incomming используется в качестве имени файла, построенного в cunstructor.
Converter::Converter(char* file) {
// string filename is a global variable
filename = file;
myfile.open(filename.c_str(), ios_base::in);
}
метод, в котором текстовый файл получает чтение:
string Converter::readTextFile() {
char c;
string txt = "";
if (myfile.is_open()) {
while (!myfile.eof()) {
myfile.get(c);
txt += c;
}
} else {
error("ERROR: can't open file:", filename.c_str());
}
return txt;
}
EDIT2: удалено
обновление:
Я снова подошел к этой точке.
фактический Main
способ:
// File path as argument
int main(int argc, char* argv[]) { if (argc
vector<string> files;
for (int g = 1; g < argc; g++) {
string s = argv[g];
string filename = "";
int pos = s.find_last_of("", s.size());
if (pos != -1) {
filename = s.substr(pos + 1);
cout << "argv[1] " << argv[1] << endl;
cout << "n filename: " << filename << "n pos: " << pos << endl;
files.push_back(filename);
}
files.push_back(s);
}
for (unsigned int k = 0; k < files.size(); k++)
{
cout << "files.at( " << k << " ): " << files.at(k).c_str() << endl;
Converter a(files.at(k).c_str());
a.getATCommandsFromCSV();
}
cout << "n" << "Programm finished...nn" << endl;
cin.ignore();
return 0;
}
На самом деле окно консоли apears, возможно, 0.5 сек и закрывается снова.
Он не останавливается ни на одном из моих cin.ignore();
может быть, он не попадает туда?
может кто-нибудь помочь?
3 ответов
вашей программе не нужно делать ничего особенного, кроме обработки аргументов командной строки. Когда вы перетаскиваете файл в приложение в Проводнике, он не делает ничего, кроме передачи имени файла в качестве аргумента программе. Аналогично для нескольких файлов.
Если все, что вы ожидаете, это список имен файлов, то просто повторите все аргументы, делайте с ними все, что хотите, и все будет сделано. Это будет работать для нуля почти произвольно многих аргументов.
может быть, вы могли бы написать тестовую программу, как это:
int main(int argc, char* argv[])
{
// argv[0] is not interesting, since it's just your program's path.
for (int i = 1; i < argc, ++i)
cout << "argv[" << i << "] is " << argv[i] << endl;
return 0;
}
и посмотреть, что произойдет после того, как вы бросаете на него разные файлы.
EDIT: просто посмотрите на ответ Джоуи.
ответ на главный вопрос
ЧТОБЫ УВИДЕТЬ ОТВЕТ НА ВАШУ ПОСЛЕДНЮЮ ПРОБЛЕМУ, СМ. НИЖНЮЮ ЧАСТЬ ЭТОГО ОТВЕТА
все перетаскиваемые файлы доступны как argv[orderOfTheFile]
(orderOfTheFile
от 1-n),
как windows создает этот порядок, теперь это - это настоящая загадка...
в любом случае, скажем, я бы создал 26 текстовых файлов (*.txt ), от a.txt
to z.txt
на моем рабочем столе,
теперь, если бы я drag & dropped их ArgsPrinter_c++.exe
расположенном непосредственно на C:\
диск,
выход будет похож на этот:
argc = 27
argv[0] = C:\ArgsPrinter_c++.exe
argv[1] = C:\Users\MyUserName\Desktop\c.txt
argv[2] = C:\Users\MyUserName\Desktop\d.txt
argv[3] = C:\Users\MyUserName\Desktop\e.txt
argv[4] = C:\Users\MyUserName\Desktop\f.txt
argv[5] = C:\Users\MyUserName\Desktop\g.txt
argv[6] = C:\Users\MyUserName\Desktop\h.txt
argv[7] = C:\Users\MyUserName\Desktop\i.txt
argv[8] = C:\Users\MyUserName\Desktop\j.txt
argv[9] = C:\Users\MyUserName\Desktop\k.txt
argv[10] = C:\Users\MyUserName\Desktop\l.txt
argv[11] = C:\Users\MyUserName\Desktop\m.txt
argv[12] = C:\Users\MyUserName\Desktop\n.txt
argv[13] = C:\Users\MyUserName\Desktop\o.txt
argv[14] = C:\Users\MyUserName\Desktop\p.txt
argv[15] = C:\Users\MyUserName\Desktop\q.txt
argv[16] = C:\Users\MyUserName\Desktop\r.txt
argv[17] = C:\Users\MyUserName\Desktop\s.txt
argv[18] = C:\Users\MyUserName\Desktop\t.txt
argv[19] = C:\Users\MyUserName\Desktop\u.txt
argv[20] = C:\Users\MyUserName\Desktop\v.txt
argv[21] = C:\Users\MyUserName\Desktop\w.txt
argv[22] = C:\Users\MyUserName\Desktop\x.txt
argv[23] = C:\Users\MyUserName\Desktop\y.txt
argv[24] = C:\Users\MyUserName\Desktop\z.txt
argv[25] = C:\Users\MyUserName\Desktop\a.txt
argv[26] = C:\Users\MyUserName\Desktop\b.txt
мой ArgsPrinter_c++.exe
исходный код:
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) {
cout << "argc = " << argc << endl;
for(int i = 0; i < argc; i++)
cout << "argv[" << i << "] = " << argv[i] << endl;
std::cin.ignore();
return 0;
}
ваша последняя проблема
я создал простую программу, которая создает только скелетон вашего класса, чтобы его можно было использовать, и основная программа побежал просто отлично => если ваша программа выходит слишком рано, проблема будет в твоем классе...
проверен исходный код:
#include <iostream>
#include <vector>
using namespace std;
class Converter{
public:
Converter(const char* f){ cout << f << endl; }
void getATCommandsFromCSV(){ cout << "called getATCommandsFromCSV" << endl; }
};
int main(int argc, char* argv[]) {
vector<string> files;
for (int g = 1; g < argc; g++) {
string s = argv[g];
string filename = "";
int pos = s.find_last_of("\", s.size());
if (pos != -1) {
filename = s.substr(pos + 1);
cout << "argv[1] " << argv[1] << endl;
cout << "\n filename: " << filename << "\n pos: " << pos << endl;
files.push_back(filename);
}
files.push_back(s);
}
for (unsigned int k = 0; k < files.size(); k++)
{
cout << "files.at( " << k << " ): " << files.at(k).c_str() << endl;
Converter a(files.at(k).c_str());
a.getATCommandsFromCSV();
}
cout << "\n" << "Programm finished...\n\n" << endl;
cin.ignore();
return 0;
}