todos solucionar soltar raton poder permite objetos muestra mover mis mac funcion deja como carpetas carpeta arrastrar arrastra archivos c++ windows parameters drag-and-drop executable

c++ - solucionar - ¿Cómo se permite arrastrar un archivo en el*.exe y obtenerlo como parámetro?



windows 10 no permite arrastrar archivos (3)

¿Qué debo hacer para que mi programa use un archivo que ha sido arrastrado y soltado en su icono como parámetro?

Mi método main actual se ve así:

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

Lo que realmente me gustaría poder hacer es seleccionar 10 (más o menos) archivos, soltarlos en el EXE y procesarlos desde mi aplicación.

EDITAR:

El parámetro entrante se usa como nombre de archivo, construido en el cunstructor.

Converter::Converter(char* file) { // string filename is a global variable filename = file; myfile.open(filename.c_str(), ios_base::in); }

El método donde se lee el archivo de texto:

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: eliminado

Actualizar:
Llegué de nuevo a este punto.

Método Main real:

// File path as argument

int main (int argc, char * argv []) {if (argc <2) {cout << "ERROR: cantidad incorrecta de argumentos! Da al menos un argumento ... / n" << endl; cout << "/ n" << "Programa cerrado ... / n / n" << endl; cin.ignore (); salida (1); return 0; }

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

En realidad, la ventana de la consola aparece durante aproximadamente 0,5 segundos y se cierra de nuevo.
No se detiene en ninguno de mis cin.ignore(); Tal vez no llegue allí?

¿Alguien puede ayudar?


Responde a la pregunta principal

PARA VER LA RESPUESTA A SU ÚLTIMO PROBLEMA VEA LA PARTE INFERIOR DE ESTA RESPUESTA

Todos los archivos de arrastrar y soltar se pueden obtener como argv[orderOfTheFile] ( orderOfTheFile es de 1-n),
sin embargo, ¿cómo Windows crea ese orden, ahora que es un verdadero misterio ...

De todos modos, digamos que crearía 26 archivos de texto plano ( * .txt ), de a.txt a z.txt en mi escritorio,
ahora si los arrastrara y los dejara caer en mi ArgsPrinter_c++.exe ubicado directamente en C:/ unidad,
una salida sería similar a esto:

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

Mi código fuente 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; }

Tu último problema

He creado un programa simple que crea solo un acelerador de tu clase para que se pueda usar, y el principal del programa corrió JUST FINE => si tu programa sale demasiado pronto, el problema estará en tu clase ...

Código fuente probado:

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


Su programa no necesita hacer nada especial aparte de manejar argumentos de línea de comandos. Cuando arrastra y suelta un archivo en una aplicación en el Explorador, no hace nada más que pasar el nombre del archivo como argumento al programa. Del mismo modo para múltiples archivos.

Si todo lo que espera es una lista de nombres de archivos, simplemente itere sobre todos los argumentos, haga lo que quiera con ellos y termine. Esto funcionará de cero a casi arbitrariamente muchos argumentos.


Tal vez podrías escribir un programa de prueba como este:

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

Y vea qué sucede después de arrojarle diferentes archivos.

EDITAR: Solo mira la respuesta de Joey.