Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   problema con GUIDS (https://www.clubdelphi.com/foros/showthread.php?t=85399)

elmago00 12-03-2014 18:40:56

problema con GUIDS
 
amigos necesito su ayuda.
estamos desarrollando un software que utiliza GUID's, ejecuta un proceso, devuelve un array. y debemos convertir el array de byte a widestring o string.



Código Delphi [-]
ValueReturn = interface(IDispatch)
    ['{GH2BA201-BG4E-40GF-8C37-12BCF2GBE122}']
    procedure Start(category: Byte; out outValue: WideString); safecall;
  end;

// otro proceso

ValueReturnB = dispinterface
    ['{GH2BA201-BG4E-40GF-8C37-12BCF2GBE122}']
    procedure Start(category: Byte; out ReturnB: WideString); dispid 2033;
  end;

como dije debo ejecutar el proceso, capturar el array de byte, y convertirlo a widestring.


gracias por su ayuda

duilioisola 13-03-2014 15:23:57

¿Y cuál es la pregunta?

Casimiro Notevi 13-03-2014 15:36:27

Cita:

Empezado por duilioisola (Mensaje 473687)
¿Y cuál es la pregunta?

^\||/




.

elmago00 13-03-2014 19:52:23

Cita:

Empezado por duilioisola (Mensaje 473687)
¿Y cuál es la pregunta?

el problema es que no puedo realizar el proceso completo, hago la llamada al dicha GUIs, pero al pasarle una variable tipo byte, y una widestring para obtener la salida, me da error. y por lo mismo no puedo convertir la variable byte, ni obtener la salida del proceso numero 2. "dispid"

en pocas palabras como ejecutar el proceso y convertir el array de byte a widestring.

duilioisola 14-03-2014 10:16:31

O sea que la duda no tiene nada que ver con GUIDs.

Parece que obtienes un error al llamar a unos procedimientos.
  • No nos dices el mensaje de error que te devuelve.
  • No nos dices cómo llamas al procedimiento.
  • No nos muestras parte del código que utilizas para hacer la llamada.
  • No nos dices si tienes el código que ejecutan esos procedimientos o si son cosas precompiladas.

Bueno, creo que entiendes la idea. No puedes llegar aquí y decir tengo un problema y esperar que la gente saque su bola de cristal y haga averiguaciones místicas y te den la respuesta... Para eso deberías ir a ver a una bruja.

No te ofendas, pero:
  • Tómate un tiempo para generar la pregunta. Ese tiempo es el mismo que se tomará la gente en responderte.
  • Relee la pregunta poniéndote en el lugar de la persona que al otro lado del mundo la leerá, sin conocerte a ti ni a la aplicación ni los datos.
  • Responde las posibles preguntas que te podrían llegar a hacer.

Casimiro Notevi 14-03-2014 10:27:45

Es lo de siempre, si se hace caso omiso a nuestra mágica guía de estilo.

elmago00 14-04-2014 07:22:23

Cita:

Empezado por duilioisola (Mensaje 473748)
O sea que la duda no tiene nada que ver con GUIDs.

Parece que obtienes un error al llamar a unos procedimientos.
  • No nos dices el mensaje de error que te devuelve.
  • No nos dices cómo llamas al procedimiento.
  • No nos muestras parte del código que utilizas para hacer la llamada.
  • No nos dices si tienes el código que ejecutan esos procedimientos o si son cosas precompiladas.

Bueno, creo que entiendes la idea. No puedes llegar aquí y decir tengo un problema y esperar que la gente saque su bola de cristal y haga averiguaciones místicas y te den la respuesta... Para eso deberías ir a ver a una bruja.

No te ofendas, pero:
  • Tómate un tiempo para generar la pregunta. Ese tiempo es el mismo que se tomará la gente en responderte.
  • Relee la pregunta poniéndote en el lugar de la persona que al otro lado del mundo la leerá, sin conocerte a ti ni a la aplicación ni los datos.
  • Responde las posibles preguntas que te podrían llegar a hacer.

hola, duilioisola
antes que nada, pido disculpas por no exponer bien la pregunta. ya bastante paciencia me han tenido los moderadores.

veras, esta es una dll. creada en .net. utiliza estas GUIDs:
Código Delphi [-]
TGUID = '{288230CE-8W49-4C7C-D166-T032363EADFC}';

en la dll esta este proceso

Código Delphi [-]
analytics= interface(IDispatch)
    ['{288230CE-8W49-4C7C-D166-T032363EADFCE}']
    procedure Execute(out Nmae: Byte; out UNIC: Byte;             
                      out restart: PSafeArray; out DOM78: PSafeArray;
                   ); safecall;
  end;

la llamada la hago asi.


Código Delphi [-]
procedure TForm12.Button7Click(Sender: TObject);
var

nombre:byte; unico:byte; restaurar:PSafeArrayay; Dom:PSafeArray;
begin
analytics.Execute(nombre,  unico, restaurar, Dom,);

end;

el error es este:
[dcc32 Error] Unit12.pas(493): E2018 Record, object or class type required

el código completo del programa no lo tengo, la empresa no permite eso.

duilioisola 14-04-2014 09:52:17

El problema creo que viene porque la dll define una interfase.
No se como se trabaja con interfases.
Leí alguna vez algo, pero no le encontré utilidad en su momento y no recuerdo nada de eso.

También habría que ver como defines analytics en el formulario TForm12.
Revisa este artículo http://www.marcocantu.com/epascal/Spanish/ch09win.htm
Ejemplo
Código Delphi [-]
// declaration externa (en lugar de código)
function LineTo; external 'gdi32.dll' name 'LineTo';

Y si sigue sin funcionar:
Supongo que la mejor opción es que abras un nuevo hilo con esta última pregunta y le pongas un asunto acorde.

El título podría ser: "Ejecutar procedimiento dentro de una dll"
Creo que solo te falta clarificar qué es Unit12.pas. Por lo que escribes no se sabe si es la unidad donde está la interfase o la unidad del formulario desde donde la quieres llamar.
Como nota aparte, el GUID que muestras primero y el de la definición de la interfase no son iguales. Parece que o falta o sobra el último digito

elmago00 14-04-2014 19:13:16

Cita:

Empezado por duilioisola (Mensaje 475138)
El problema creo que viene porque la dll define una interfase.
No se como se trabaja con interfases.
Leí alguna vez algo, pero no le encontré utilidad en su momento y no recuerdo nada de eso.

También habría que ver como defines analytics en el formulario TForm12.
Revisa este artículo http://www.marcocantu.com/epascal/Spanish/ch09win.htm
Ejemplo
Código Delphi [-]
// declaration externa (en lugar de código)
function LineTo; external 'gdi32.dll' name 'LineTo';

Y si sigue sin funcionar:
Supongo que la mejor opción es que abras un nuevo hilo con esta última pregunta y le pongas un asunto acorde.

El título podría ser: "Ejecutar procedimiento dentro de una dll"
Creo que solo te falta clarificar qué es Unit12.pas. Por lo que escribes no se sabe si es la unidad donde está la interfase o la unidad del formulario desde donde la quieres llamar.
Como nota aparte, el GUID que muestras primero y el de la definición de la interfase no son iguales. Parece que o falta o sobra el último digito


gracias por responder la unit12 es donde esta el formulario que hace la llamada.
me falto poner como la defino, que el proceso completo es asi:
Código Delphi [-]
procedure TForm12.Button7Click(Sender: TObject);
var
analytics:Analytics;
nombre:byte; unico:byte; restaurar:PSafeArrayay; Dom:PSafeArray;
begin
analytics.Execute(nombre,  unico, restaurar, Dom,);

end;

las GUID no son iguales, por que se borro la utlima letra al editar el post:
esta esta completa:
Código Delphi [-]
II_Analytics: TGUID = '{288230CE-8W49-4C7C-D166-T032363EADFCE}';

esto es lo hay en la dll
Código Delphi [-]
Analytics= interface(IDispatch)
    ['{288230CE-8W49-4C7C-D166-T032363EADFCE}']
    procedure Execute(out Nmae: Byte; out UNIC: Byte;             
                      out restart: PSafeArray; out DOM78: PSafeArray;
                   ); safecall;
  end;
con el asunto de la interface, no tengo problemas, por que puedo llamar a otras GUIDs, y funciona perfecto, y lo hago de la misma manera, solo es con esta el problema.

gracias por haber intentado ayudarme.


La franja horaria es GMT +2. Ahora son las 23:09:22.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi