Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Romualdo23

#1
Tengo un programa de consola en C++ que funciona perfectamente, pero para utilzarlo desde VB.NET me vendria mejor crear una .dll

¿Como podria hacerlo?

#2
Pero ilustrame un poco hombre, que nunca he tocado este lenguaje de programacion..

Un pequeño ejemplo o algo, no se..
#3
Si, pero me refiero a si quiero utilizar los datos en otra funcion. Primero habria que crear una variable global para pasarle los datos extraidos y luego esa variable poder usarla en cualquier parte del codigo.

En vb.net se hacerlo, pero no en C++

#4
Vale, vamos avanzando, habia que añadir esto:

Código (cpp) [Seleccionar]
using std::string;
using std::cout;
using std::endl;


Ahora si me devuelve la posicion con:

Código (cpp) [Seleccionar]
cout << endl << L"INFO: begin_pos: " << begin_pos;
cout << endl << L"INFO: end_pos: " << end_pos;




Ahora solo falta extraer la cadena, he probado con

Código (cpp) [Seleccionar]
wprintf(L"\nINFO: Nombre del perfil: ", extract);

Pero no devuelve nada.

Edito:

Bueno, esto va mejorando.. Ahora ya me muestra algo, pero parece que por algun motivo, no se selecciona bien la longitud de los datos que tiene que extraer y me muestra mas caracteres de los que deberia:



El comienzo lo hace bien ya que se puede ver que comienza a extraer desde "MiRed", pero como digo, la longiud de los datos que captura no es la correcta, deberia capturar solo hasta "</name>", quedando en consola solamente "MiRed"

Este es el codigo que utilizo:

   
Código (cpp) [Seleccionar]
int size = 1000;

   std::string text(profBuffer, profBuffer+ size);

   std::string begin_text("<name>");
   std::string end_text("</name>");

   size_t begin_pos = text.find(begin_text) + begin_text.length();
   size_t end_pos = text.find(end_text);

   std::string extract = text.substr(begin_pos,end_pos);

   const char* NombrePerfil = extract.c_str();

   std::cout << NombrePerfil << std::endl;


Edito de nuevo:

Pues ya esta resuelto, con tantos cambios habia olvidado reemplazar otra vez la linea que me dijiste ayer:

Código (cpp) [Seleccionar]
std::string extract = text.substr(begin_pos,end_pos);

                                                                         Por

Código (cpp) [Seleccionar]
std::string extract = text.substr(begin_pos,end_pos-begin_pos);


Una ultima pregunta..

Es posible guardar los datos extraidos en una variable, para utilizar posteriormente esos datos sin tener que volver a consultar el perfil xml?
#5
Me dice que wcout y endl no esan definidos..
#6
¿Puede que el error sea porque "profBuffer" ya este declarado como WCHAR y yo lo estaba declarando mas abajo como wchar_t?

El codigo que muesra el perfil xml completo en consola es el siguiente:

Código (cpp) [Seleccionar]
UINT status = ERROR_SUCCESS;

               WCHAR profBuffer[WPA_API_MAX_BUFFER_SIZE] = {0};
       HANDLE wlanHandle = 0;
       GUID interfaceGuid = {0};
       DWORD wlanResult = 0;

               status = WlanGetProfile(wlanHandle, &interfaceGuid, 0, profBuffer, NULL, TRUE, NULL, &wlanResult);

               wprintf(profBuffer);


Con ese codigo obtengo esta salida:



Por otra parte, he probado lo que comentas y nunca recibo ningun valor al comprobar "begin_pos" y "end_pos", es como si no leyera la cadena de texto por algun motivo..

Asi lo estoy haciendo ahora, ya no declaro"profBuffer" como  wchar_t y le he asignado un tamaño a int:

   
Código (cpp) [Seleccionar]


   int size = 2000;

   std::string text(profBuffer, profBuffer + size);

   // define what we're looking for
   std::string begin_text("<name>");
   std::string end_text("</name>");

   // find the start and end of the text we need to extract
   size_t begin_pos = text.find(begin_text) + begin_text.length();
   size_t end_pos = text.find(end_text);

   wprintf(L"\nINFO: begin_pos: ", begin_pos);
   wprintf(L"\nINFO: end_pos: ", end_pos);

   // create a substring from the positions
   std::string extract = text.substr(begin_pos, end_pos);

    //test that we got the extract
    wprintf(L"\nINFO: Nombre del perfil: ", extract);


De esta forma ya no se cuelga, pero tampoco me muestra nada en consola..



Parece que el mtoivo de que se colgara era que antes ponia "int size = 0;", Ahora con "int size = 2000;" ya no se cuelga, pero como digo, parece que no lee la cadena..
#7
Nada, no hay forma de hacerlo. Lo dejo ya por imposible porque llevo dos dias con esta tonteria y estoy empezando a ponerme de mala hosia.
#8
¿¿¿ Tan dificil es hacer eso en C ????

Si eso mismo en VB.NET lo hago en 1 minuto con esta funcion...

Código (vbnet) [Seleccionar]

   Dim Cadena As String = XmlProfile
   Dim Delimitador_Ini As String = "<name>"
   Dim Delimitador_Fin As String = "</name>"

   Cadena = Split(Cadena , Delimitador_Ini, , CType(CompareMethod.Text, Microsoft.VisualBasic.CompareMethod))(1)
   Cadena = Split(Cadena , Delimitador_Fin, , CType(CompareMethod.Text, Microsoft.VisualBasic.CompareMethod))(0)

   Label1.Text = "Nombre del perfil: " & Cadena
#9
Cita de: ivancea96 en 24 Abril 2015, 11:48 AM
En primer lugar, size es siempre 0. Tendrás que poner ahí el tamaño de la cadena.

¿Como puedo saber que tamaño tiene la cadena?

Cita de: ivancea96 en 24 Abril 2015, 11:48 AMEn segundo lugar, pon esta linea en sustitucion de la antigua:
Código (cpp) [Seleccionar]
std::string extract = text.substr(begin_pos,end_pos-begin_pos);

He reemplazado lo que me has dicho pero sigue colgandose y cerrandose la aplicacion..

Cita de: ivancea96 en 24 Abril 2015, 11:48 AMEn tercer lugar, en caso de que quieras agarrar todos los datos, tal vez te interese crear un método para leer un xml y guardarlo ordenadamente, eso ya como veas.

Si, estuve mirando tambien esa opcion, pero los ejemplos que encontre eran solo para abrir archivos xml y yo en este caso no necesito abrir ningun archivo, ya que los datos los recibo del pc y se almacenan en un buffer..

Gracias por la ayuda.
#10
Hola amigos.

Tengo una funcion en C que me muestra en consola el perfil wireless que yo le indique, hasta aqui todo bien. El problema esta en que recibo los datos en ese formato:

Código (xml) [Seleccionar]
<?xml version="1.0"?>
<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
<name>NombrePerfil</name>
<SSIDConfig>
<SSID>
<hex>75775657685794438794</hex>
<name>NombrePerfil</name>
</SSID>
</SSIDConfig>
<connectionType>ESS</connectionType>
<MSM>
<security>
<authEncryption>
<authentication>WPA2PSK</authentication>
<encryption>AES</encryption>
<useOneX>false</useOneX>
</authEncryption>
<sharedKey>
<keyType>passPhrase</keyType>
<protected>false</protected>
<keyMaterial>1234567890</keyMaterial>
</sharedKey>
<keyIndex>1</keyIndex>
</security>
</MSM>
</WLANProfile>




Entonces necesitaria una funcion que extraiga los datos que hay entre <name> y </name>, <connectionType> y </connectionType> y asi con todos los valores.

Quedaria algo asi en consola:

Nombre del perfil: NombrePerfil
Tipo de conexion: ESS
Aunenicacion: WPA2PSK

etc..

Aclaracion: los datos no los recibo de un archivo, sino del PC, de los perfiles almacenados en la WLAN con esta llamada:

hp = Device->GetProfile(ARRAYSIZE(profBuffer), profBuffer);

He probado con este codigo que vi por inernet, pero se bloquea la aplicacion y se termina (creo que se bloquea porque es codigo de C++ y al tratar de usarlo en C se bloquea, no lo se):


   
Código (cpp) [Seleccionar]
int size = 0;

   wchar_t* Perfil = profBuffer;

   std::string text(Perfil, Perfil + size);

   // define what we're looking for
   std::string begin_text("<name>");
   std::string end_text("</name>");

   // find the start and end of the text we need to extract
   size_t begin_pos = text.find(begin_text) + begin_text.length();
   size_t end_pos = text.find(end_text);

   // create a substring from the positions
   std::string extract = text.substr(begin_pos,end_pos);

   // test that we got the extract
   wprintf(L"\nINFO: Nombre del perfil: ", extract);


Espero que me puedan ayudar. Saludos!!