Как включить перетаскивание файла на * .exe и получить его в качестве параметра? - PullRequest
6 голосов
/ 11 января 2011

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

Мой текущий метод main выглядит следующим образом:

int main(int argc, char* argv[])
{
    if (argc != 2) {
        cout << "ERROR: Wrong amount of arguments!" << endl;
        cout << "\n" << "Programm closed...\n\n" << endl;
        exit(1);
        return 0;
    }

    Converter a(argv[1]);
    // ...

    cout << "\n" << "Programm finished...\n\n" << endl;

    // cin.ignore();
    return 0;
}

Что я действительно хотел бы сделать, так это выбрать 10 (или около того) файлов, поместить их в EXE-файл и обработать их из моего приложения.


РЕДАКТИРОВАТЬ:

Входящий параметр используется в качестве имени файла, созданного в конструкторе.

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;
}

РЕДАКТИРОВАТЬ2: удалено

Обновление:
Я снова попал в эту точку.

Фактический Main Метод:

// File path as argument

int main (int argc, char * argv []) {if (argc <2) {cout << "ОШИБКА: неверное количество аргументов! Введите хотя бы один аргумент ... \ n" <<endl;cout << "\ n" << "Программа закрыта ... \ n \ n" << endl;cin.ignore ();выход (1);вернуть 0;} </p>

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;
}

На самом деле окно консоли открывается примерно на 0,5 секунды и снова закрывается.
Оно не останавливается ни на одном из моих cin.ignore(); Может быть, оно не доходит?

Кто-нибудь может помочь?

Ответы [ 3 ]

15 голосов
/ 11 января 2011

Ваша программа не должна делать ничего особенного, кроме обработки аргументов командной строки.Когда вы перетаскиваете файл в приложение в Проводнике, он просто передает имя файла в качестве аргумента программе.Аналогично для нескольких файлов.

Если все, что вы ожидаете, это список имен файлов, то просто переберите все аргументы, делайте с ними все, что хотите, и все будет готово.Это будет работать от нуля до почти произвольного числа аргументов.

3 голосов
/ 11 января 2011

Может быть, вы могли бы написать такую ​​тестовую программу:

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;
}

и посмотреть, что произойдет после того, как вы добавите в нее разные файлы.* Просто посмотрите на ответ Джои.

1 голос
/ 04 марта 2015

Ответ на главный вопрос

ЧТОБЫ УВИДЕТЬ ОТВЕТ НА ВАШУ ПОСЛЕДНЮЮ ПРОБЛЕМУ СМОТРЕТЬ ДНО ЭТОГО ОТВЕТА

Все файлы перетаскивания можно получить как argv[orderOfTheFile] (orderOfTheFile из 1-n),
однако как Windows создает этот порядок, теперь , что - настоящая загадка ...

В любом случае, допустим, я бы создал на моем рабочем столе 26 файлов с простым текстом (*. Txt ), от a.txt до z.txt,
Теперь, если бы я перетащил и уронил их на мой 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; 
}

Ваша последняя проблема

Я создал простую программу, которая создает только скелет вашего класса, чтобы его можно было использовать, и основной самой программы запустил JUST FINE =>, если ваша программа тоже выходит скоро проблема будет в вашем классе ...

Протестированный исходный код:

#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;
}
...