Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Problema al leer un vector puntero

Estas en el tema de Problema al leer un vector puntero en el foro de C/C++ en Foros del Web. Este tema está relacionado a un problema de un tema anterior que publique pero ahora consiste en leer datos de un vector puntero el problema ...
  #1 (permalink)  
Antiguo 04/09/2013, 14:24
 
Fecha de Ingreso: junio-2008
Mensajes: 109
Antigüedad: 15 años, 10 meses
Puntos: 0
Exclamación Problema al leer un vector puntero

Este tema está relacionado a un problema de un tema anterior que publique pero ahora consiste en leer datos de un vector puntero el problema radica que estoy usando C# y desde ahí importo las bibliotecas que he creado de C++ y por tanto no puedo depurar del lado de C++ bien tengo la estructura siguiente:

Código C++:
Ver original
  1. struct NetxInfo
  2. {
  3. public:
  4.     ULONG pid;
  5.     WCHAR filename[MAX_PATH];
  6.     WCHAR pathname[MAX_PATH];
  7.  
  8.     WCHAR protocol[10];
  9.     WCHAR state[MAX_PATH];
  10.     WCHAR srcip[MAX_PATH];
  11.     DWORD srcport;
  12.     WCHAR destip[MAX_PATH];
  13.     DWORD destport;
  14. };

y tengo mi función donde creo un vector puntero y le asigno valores:

Código C++:
Ver original
  1. vector<NetxInfo>* initialNetxes = new vector<NetxInfo>();
  2.    
  3.     NetxInfo val;
  4.                    
  5.     val.pid = 112;
  6.     CopyString(L"explorer.exe", val.filename, MAX_PATH);
  7.     CopyString(L"C:/Windows", val.pathname, MAX_PATH);
  8.     CopyString(L"UDP", val.protocol, MAX_PATH);
  9.     CopyString(L"SYN", val.state, MAX_PATH);
  10.     CopyString(L"192.168.1.001", val.srcip, MAX_PATH);
  11.     val.srcport = 444;
  12.     CopyString(L"192.168.002", val.destip, MAX_PATH);
  13.     val.destport = 6060;
  14.  
  15.     initialNetxes->push_back(val);
  16.            
  17.     val.pid = 113;
  18.     CopyString(L"schost.exe", val.filename, MAX_PATH);
  19.     CopyString(L"C:/windows", val.pathname, MAX_PATH);
  20.     CopyString(L"TCP", val.protocol, MAX_PATH);
  21.     CopyString(L"Waiting", val.state, MAX_PATH);
  22.     CopyString(L"192.168.1.004", val.srcip, MAX_PATH);
  23.     val.srcport = 425;
  24.     CopyString(L"192.168.1.005", val.destip, MAX_PATH);
  25.     val.destport = 1212;
  26.  
  27.     initialNetxes->push_back(val);


todo esto va bien el problema se está dando en la función donde intento leer los valores del vector puntero y lo hago de la siguiente forma:

Código C++:
Ver original
  1. vector<NetxInfo>* conv = (vector<NetxInfo>*) source;
  2.  
  3.         pid = (*conv)[indice].pid;
  4.         filename = (*conv)[indice].filename;
  5.         pathname = (*conv)[indice].pathname;
  6.         protocol = (*conv)[indice].protocol;
  7.         state = (*conv)[indice].state;
  8.         srcip = (*conv)[indice].srcip;
  9.         srcport = (*conv)[indice].srcport;
  10.         destip = (*conv)[indice].destip;
  11.         destport = (*conv)[indice].destport;

nota: indice es un parámetro de la función que hace este proceso y le envío el indice del vector que quiero recuperar.

Espero puedan ayudarme.

Última edición por EL_DOC; 04/09/2013 a las 14:33
  #2 (permalink)  
Antiguo 04/09/2013, 14:46
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: Problema al leer un vector puntero

Código C:
Ver original
  1. filename = (*conv)[indice].filename;
  2.         pathname = (*conv)[indice].pathname;
  3.         protocol = (*conv)[indice].protocol;

Estas no son asignaciones de contenido, solo estás copiando la dirreción del puntero WCHAR. Eso puede ser peligroso (si eliminas el vector y despues intentas usar ese puntero).
  #3 (permalink)  
Antiguo 04/09/2013, 14:58
 
Fecha de Ingreso: junio-2008
Mensajes: 109
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Problema al leer un vector puntero

Cita:
Iniciado por amchacon Ver Mensaje
Código C:
Ver original
  1. filename = (*conv)[indice].filename;
  2.         pathname = (*conv)[indice].pathname;
  3.         protocol = (*conv)[indice].protocol;

Estas no son asignaciones de contenido, solo estás copiando la dirreción del puntero WCHAR. Eso puede ser peligroso (si eliminas el vector y despues intentas usar ese puntero).
si lo que pasa es que la función completa es de la siguiente forma:

Código C++:
Ver original
  1. MALHOSTNATIVE_API void GetNetxInfo(void* source, int indice, ULONG& pid, void*& filename, void*& pathname, void*& protocol,  void*& state, void*& srcip, DWORD& srcport, void*& destip, DWORD& destport)                                   
  2. {
  3.     if(source != NULL)
  4.     {
  5.         vector<NetxInfo>* conv = (vector<NetxInfo>*) source;
  6.  
  7.         pid = (*conv)[indice].pid;
  8.         filename = (*conv)[indice].filename;
  9.         pathname = (*conv)[indice].pathname;
  10.         protocol = (*conv)[indice].protocol;
  11.         state = (*conv)[indice].state;
  12.         srcip = (*conv)[indice].srcip;
  13.         srcport = (*conv)[indice].srcport;
  14.         destip = (*conv)[indice].destip;
  15.         destport = (*conv)[indice].destport;
  16.     }
  17. }

como estoy usando C# para todo el proyecto y C++ para ciertas funciones entonces le envío valores por referencia
  #4 (permalink)  
Antiguo 04/09/2013, 14:59
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: Problema al leer un vector puntero

No, lo que estás pasando por referencia es el puntero. El contenido sigue siendo el mismo.
  #5 (permalink)  
Antiguo 04/09/2013, 15:01
 
Fecha de Ingreso: junio-2008
Mensajes: 109
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Problema al leer un vector puntero

y del lado de C# hago la importación de la función de C++

Código C:
Ver original
  1. [DllImport("MalHostNative.dll")]
  2.         public extern static void GetNetxInfo(IntPtr source, int indice, out ulong pid, out IntPtr filename,
  3.                                               out IntPtr pathname, out string protocol, out string state,
  4.                                               out string srcip, out int srcport, out string destip,
  5.                                               out int destport);
  #6 (permalink)  
Antiguo 04/09/2013, 15:03
 
Fecha de Ingreso: junio-2008
Mensajes: 109
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Problema al leer un vector puntero

Y la llamada de la función la hago de esta forma:

Código C:
Ver original
  1. var netxInfo = new NetxInfo();
  2.  
  3.                     IntPtr filename, pathname;
  4.  
  5.                     MalHostNativeImports.GetNetxInfo(source, i, out netxInfo.pid, out filename, out pathname, out netxInfo.protocol, out netxInfo.state, out netxInfo.srcip, out netxInfo.srcport, out netxInfo.destip, out netxInfo.destport);
  #7 (permalink)  
Antiguo 04/09/2013, 16:18
 
Fecha de Ingreso: junio-2008
Mensajes: 109
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Problema al leer un vector puntero

Cita:
Iniciado por amchacon Ver Mensaje
No, lo que estás pasando por referencia es el puntero. El contenido sigue siendo el mismo.
Gracias amchacon me sirvió esta explicación ya solucioné el problema y radicaba que se daba un error de conversión al pasar la referencia del puntero que es WCHAR del lado de c++ y string del lado de C#

Etiquetas: int, puntero, string, struct, vector
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:40.