SoloCodigo

CLR: .Net / Mono / Boo / Otros CLR => C# => Mensaje iniciado por: snay en Jueves 29 de Noviembre de 2007, 17:40

Título: Convertir Un Struct En Un Char*
Publicado por: snay en Jueves 29 de Noviembre de 2007, 17:40
Por favor necesito convertir o tratar un struct como un char* el problema es que tengo una dll externa y a uno de sus metodo se le debe de pasar una referencia a un tipo de estructura pero se la pasan como char
Título: Re: Convertir Un Struct En Un Char*
Publicado por: JuanK en Viernes 30 de Noviembre de 2007, 14:30
...
cual es la estructura que debes convertir?
como tip... mientras tanto... las estructuras de C++ se deben crear en C# como clases.
Título: Re: Convertir Un Struct En Un Char*
Publicado por: snay en Lunes 3 de Diciembre de 2007, 16:26
mira en esta es la estructura

public struct IsisSrcHeader
{
    public int number;            /* sSearch number (start in 1). */
    public int hits;               /* tTotal posting retrieved. */
    public int recs;               /* tTotal records retrieved. */
    public int segmentpostings;         /* nNumber of hits. */
    public System.Char[] dbname;      /* dData base name. */
    public System.Char[] booleanexpr;   /* sSearch expression. */
};

y se la tengo que pasar al siguinte metodo

 [DllImport("Isis32.dll", EntryPoint = "IsisSrcSearch")]
    unsafe public static extern int IssSrcSearch(int handle, int tsfnum, char* express, char* SearchStru);

ahora en el ejemplo que tengo esta en visual basic y se lo pasan asi

IsisSrcSearch (H, 0, Expression, TOCHAR(Hdrstru));



a ver si me puedes tirar un cabo con esto
Título: Re: Convertir Un Struct En Un Char*
Publicado por: JuanK en Lunes 3 de Diciembre de 2007, 21:17
Código: Text
  1. [ StructLayout( LayoutKind.Sequential, CharSet=CharSet.Ansi ) ]
  2. public struct IsisSrcHeader
  3. {
  4.  public int number;
  5.  public int hits;
  6.  public int recs;
  7.  public int segmentpostings;
  8.  public System.Char[] dbname;
  9.  public System.Char[] booleanexpr;
  10. };
  11.  

esa es la declaración de esa estructura en C#, si lo que quieres adicionalmente es apuntarle con char* debes declarar tipos unsafe y trabajar / compilar habilitando esa opción en el compilador.

También puedes trabajar con 'punteros administrados' haciendo uso de IntPtr y de la clase estática Marshall:

Marshal.StructureToPtr

El tip de antes estaba mal, ya que en efecto es al contrario, las estructuras de C# se van a c++ como clases.
Título: Re: Convertir Un Struct En Un Char*
Publicado por: snay en Lunes 3 de Diciembre de 2007, 22:47
el problema es que cuando declaro  
IsisSrcHeader* SearchStru;

me da un error , algo de que no se puede declara un puntero a un tipo de dato admninistrador y lo tengo declarado dentro de unsafe.

nsafe
            {
                IsisSrcHeader* SearchStru;
                SearchStru.dbname = new char[64];
                SearchStru.booleanexpr = new char[513];
                System.String  str = "C:\\AppServ\\www\\weblis\\DB\\Libcat\\Work";
                char* va = ((char*)Marshal.StringToHGlobalAnsi(str));

              //IntPtr estructura = ((char*)SearchStru);

                int A = Myisisdll.IsisAppNew();
                int H = Myisisdll.IsisSpaNew(A);
                int r = Myisisdll.IsisSpaMf(H, va);
                System.String cadena = "*";
               
                //Marshal.StructureToPtr(SearchStru, va, badera);

                System.Char* cadenaptr = ((System.Char*)Marshal.StringToHGlobalAnsi(cadena));



                r = Myisisdll.IsisSrcSearch(H, 0, cadenaptr, );



si tuviera algun ejemplo del uso del Intptr pues no entiendo bien su uso
Título: Re: Convertir Un Struct En Un Char*
Publicado por: JuanK en Martes 4 de Diciembre de 2007, 05:06
asi sera muy dificil de ayudarte... pega todo el codigo para ver como has declaradop el struct , recuerda que si usas punteros inseguros no administrados debes usar el operador primario de referencia '->' en vez de '.'
Título: Re: Convertir Un Struct En Un Char*
Publicado por: snay en Miércoles 5 de Diciembre de 2007, 15:01
mira este es elcod en general, pero ademas ahora hciendo uns prueba me acabo de dar cuenta que no m,e esta utilizando la dll en ningun momento, porque yo se la habia copiado para system32, porque me habian dicho que debia copiarlas ahi y pues me las borre y no sucedio nada, dejame preuntart es ahi donde se debe de copiar la dll o en otra direccion, ?como se registran las dll ?
Título: Re: Convertir Un Struct En Un Char*
Publicado por: JuanK en Jueves 6 de Diciembre de 2007, 19:51
1- no es necesario pegarle en  system32, desde que este en el mismo folder del ejecutable funciona o también puedes cambiar una configuración para que te la busque ahí donde la pongas...

2- aunque estés en un contexto unsafe no puedes declarar un puntero de un tipo de dato administrado...

ya no recuerdo muy bien , pero

Código: Text
  1. char* pun_SearchStru = ((char*)pnt);
  2.  

esto debe estar mal, busca metodos dentro de pnt o dentro de la clase Marshall que te permitan convertir pnt en un puntero inseguro.
Título: Re: Convertir Un Struct En Un Char*
Publicado por: snay en Viernes 7 de Diciembre de 2007, 16:06
mira hermano no se como registrar la dll en el visualstudio para poder utilizarla o de q manera le digo en que lugar se encuentra
Título: Re: Convertir Un Struct En Un Char*
Publicado por: JuanK en Viernes 7 de Diciembre de 2007, 16:11
ya te  lo dije mas arriba, no entiendo cual es tu problema y nunca he visto necesidad de registrar ninguna dl para eso.
Título: Re: Convertir Un Struct En Un Char*
Publicado por: snay en Martes 11 de Diciembre de 2007, 14:47
hermano como puedes cambiar una configuración para que te la busque la dll donde uno  quiera