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.