c++ - que - parametros por linea de comandos c
¿Cómo puedo acceder a argc y argv en c++ desde una función de biblioteca? (10)
Existe la función GetCommandLine () en la API de Win32. En otras plataformas, tendría que guardar argc / argv en algún lugar (¿variable externa?).
Estoy escribiendo una biblioteca que se cargará dinámicamente en C ++.
Me gustaría leer argc y argv (por razones de depuración) desde mi código, sin embargo, no tengo acceso a la función principal. ¿Hay alguna manera de recuperar la línea de comandos (tanto la solución de Windows como la de Linux serían buenas).
Gracias, Dan
¿Has pensado alguna vez en usar variables de entorno en lugar de la línea de comando? Puede ser más fácil para el usuario según el tipo de aplicaciones en las que se utilizará la biblioteca, y puede usar la función getenv () estándar.
Creo que, en cualquier caso, si su biblioteca va a usar argc y argv, el programa debería ser el que los pase.
En Linux, el pseudo-archivo / proc / self / cmdline contiene la línea de comando para el proceso. Cada argumento se termina con un byte 0, y el argumento final es seguido por un byte 0 adicional.
En Windows puede acceder a argc / argv mediante __argc y __argv. __wargv si quieres la versión de personaje ancho.
En Windows puede usar GetCommandLine () para obtener un puntero a la línea de comando y luego usar CommandLineToArgvW () para convertir ese puntero a formato argv []. Sin embargo, solo hay una versión amplia (Unicode) disponible.
En Windows, utilizo este tipo de cosas para obtener los argumentos:
#include <windows.h>
#include <string>
#include <vector>
#include <cwchar>
#include <cstdio>
#include <clocale>
using namespace std;
vector<wstring> getArgs() {
int argc;
wchar_t** argv = CommandLineToArgvW(GetCommandLineW(), &argc);
vector<wstring> args;
if (argv) {
args.assign(argv, argv + argc);
LocalFree(argv);
}
return args;
}
int main() {
const vector<wstring> argv = getArgs();
setlocale(LC_CTYPE, ".OCP");
for (vector<wstring>::const_iterator i = argv.begin(); i != argv.end(); ++i) {
wprintf(L"%s/n", i->c_str());
}
}
Editar: Una función getArgs como esa también es útil para mingw ya que mingw no es compatible con wmain ().
Este hilo muestra cómo hacerlo en Linux.
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.system/2005-07/0147.html
Puedo sugerir que esto suena como una situación extraña. ¿Estás escribiendo un plugin o algo así? ¿Quizás no deberías acceder a argv / argc?
Use los comandos getpid () y ps.
int pid;
int fd;
char cmd [80];
pid = getpid ();
sprintf (cmd, "ps% d", pid);
fd = popen (cmd, "r");
.... las líneas deberían ser como
.... 1358 ./a.out abc def
Esto debería funcionar bajo Linux:
#include <stdio.h>
#include <unistd.h>
void findargs(int *argc, char ***argv) {
size_t i;
char **p = &__environ[-2];
for (i = 1; i != *(size_t*)(p-1); i++) {
p--;
}
*argc = (int)i;
*argv = p;
}
int main(int argc, char **argv) {
printf("got argc=%d, argv=%p/n", argc, argv);
findargs(&argc, &argv);
printf("found argc=%d, argv=%p/n", argc, argv);
return 0;
}
Nota: falla si se ha llamado a setenv ().