FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
Error Parámetro Referencia componente ActiveX
Hola Amigos del Foro,
Actualmente tengo un problema usando un componente ActiveX que esta devolviendo un parámetro por referencia de tipo WideString(Es la definición de la importación del componente). Al momento de usar la funcion y pasar un parametro de tipo WideString me esta mostrando el error: "Access violations at address 1381O7AO in module *.DLL. Write of address 00000000" La definición de la función es:
La definición Exacta según el que ha creado el componente: HRESULT ReadInformation([in] BSTR* szCard, [in] int iTimeChip, [in] int iTimeMag, [in] int iType, [in] BSTR messMag, [out, retval] int *rc) Yo estoy haciendo una simple prueba de la función:
Si algún compañero del foro me puede ayudar, por que se esta generando ese problema o la forma de como debe de pasarse un parámetro por referencia a un ActiveX? La persona que creo el componente me indico trabajarlo con puntero y que a este tengo que asignarle memoria (memoria dinámica). Si pudieran indicarme como es la definición o un ejemplo de lo que me han indicado. Muchas Gracias a los que me pudieran compartir alguna solución para probar o es problema del componente ActiveX. según el que desarrollo este componente con un app. en visual basic le trabaja muy bien. Última edición por Maniches fecha: 17-09-2018 a las 18:32:10. |
#2
|
||||
|
||||
Supongo que CartInformation es donde el componente ActiveX devuelve información.
En ese caso, deberás reservar memoria suficiente (Seguramente el manual te informará de la máxima longitud). Si no sabes este dato, toma un valor que consideres suficiente como para ir un poco sobrado. El tipo de puntero debería ser PWideChar. Recuerda que en muchos casos conviene poner todo en un try..finally para asegurarte de que liberas la memoria, pase lo que pase. Te dejo un ejemplo que llama a una función de Windows para obtener la carpeta temporal.
|
#3
|
||||
|
||||
|
#4
|
||||
|
||||
Gracias Amigo duilioisola
por tu pronta respuesta. Si ves el post inicial lo volví a actualizar ya que me enviaron la definición de la función. Voy hacer una prueba en base a tu ejemplo y a ver si me funciona. Yo soy nuevo en este tipo de manejo de componentes ActiveX. si me funciona bien publico la solución para algún amigo que lo necesite. Si tienes alguna otra sugerencia en base a como esta definido la función te lo agradecería. Saludos y un abrazo a la distancia. |
#5
|
||||
|
||||
Gracias Amigo duilioisola
sinceramente muchas gracias por tu tiempo en responder y por tu ayuda. he realizado el cambio en base a tu ejemplo que me sugieres y me sale estos errores: [dcc32 Error] Unit2.pas(38): E2033 Types of actual and formal var parameters must be identical [dcc32 Error] Unit2.pas(39): E2010 Incompatible types: 'WideString' and 'PWideString' [dcc32 Error] Unit2.pas(43): E2017 Pointer type required intente cambiar al tipo de dato PWIDESTRING y me sale los mismos mensajes de error. habría que cambiar la definición de la función cuando se importo el componente? (*Lib_TLB.pas) o algún otra sugerencia? |
#6
|
||||
|
||||
Amigo duilioisola
He intentado modificar la forma de usar la función en base a lo que sugeriste y si bien me compila y ya no me muestra error no puedo obtener la información del parámetro:
La información que debe devolver es: '092261779...' pero revisando el valor que se asigna como resultados de la función es: CardInformation := WideChar(CardInformation2) --> #$1A30 CardInformation := PWideChar(CardInformation2) --> 'Ұ'#2 CardInformation := StrPas(PAnsiChar(CardInformation2)) --> '°'#4#2 que sugerencias amigo por donde puede estar el problema? |
#7
|
||||
|
||||
Creo que te sobra un ^.
Código:
1) Reservo Memoria GetMem me devuelve que en la posición 10000 hay un bloque continuo de 255x2 bytes reservados para mi CartInformatio2 = 10000 CartInformatio2^ = 'B_A%S(U R-A.......' En la posición de memoria 10000 hay basura (restos de cosas que el ordenador haya procesado) 2) Le paso la posición al componente ActiveX Esta función rellena a partir de la posición recibida los datos que quiere devolver, terminando con un \n CartInformatio2 = 10000 CartInformatio2^ = '092261779...\n' 3) Convierto la información recibida en algo mas ameno para trabajar en Delphi 4) Libero memoria El bloque de 255x2 bytes queda libre para que otro proceso lo pueda utilizar. Lo que haya en la posicion 10000 en adelante se considera basura para el próximo proceso que utilice. |
#8
|
||||
|
||||
Error de acceso y liberación de puntero
Amigos del foro.
Acudo a los amigos a apoyarme al resolver un problema que tengo. para iniciar el problema me esta ocurriendo cuando usa le versión Delphi 6, ya que la misma codificación en Delphi mas actualizado Delphi Tokyo trabaja todo bien. Yo necesito hacer que esto trabaje en delphi 6 ya que el sistema esta usando esa version. Hay una función de un componente ActiveX y su definición de la importación del componente es:
yo he creado el siguiente proc que si funciona en la versión Tokyo:
El error que me muestra la linea ( CardInformation2 := PWideChar(CardInformation^) ) es: "Access violation at address 00404A83 in module 'TestCInf.exe'. Read of address 0034001C'" Por favor necesito que me puedan ayudar a identificar el problema, como les mencionaba esto si funciona en una versión mas reciente de delphi, el componente activex requiere de memoria dinámica y por ello se reserva la memoria y luego se libera. pero en Delphi 6 no me esta permitiendo. Muchas gracias a los amigos que me puedan responder sugiriendo una solución o compartiendo un ejemplo para poder validar la solución. de antemano muchas gracias. |
#9
|
||||
|
||||
He unido ambos hilos porque es lo mismo
|
#10
|
||||
|
||||
Gracias amigo, pero no tienes una idea de lo que puede estar pasando?
|
#11
|
||||
|
||||
¿Por qué no usas el código que te ha puesto de ejemplo duilioisola?
|
#12
|
||||
|
||||
si quito en carácter que el indica "^"
al compilar me muestra el sgte error: "Types of actual and formal var parameters must be identical"
como mencionaba el ejemplo que publico si me esta funcionando en la versión mas actual. No se porque lo mismo no me funciona en D6. Gracias por tu ayuda. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Como quitar referencia de un componente | steelha | Varios | 7 | 25-02-2013 15:48:58 |
Componente ActiveX importardo da error | jmlifi | OOP | 5 | 03-05-2010 14:04:33 |
Componente activex | levache | Internet | 6 | 30-12-2006 05:01:11 |
Ver componente ActiveX | piccolo2101 | Varios | 1 | 05-12-2005 09:59:23 |
Eliminar componente ActiveX | Coco_jac | Varios | 5 | 08-08-2005 18:43:52 |
|