Delphi - Cadena de Caracteres en DLL

 
Vista:

Cadena de Caracteres en DLL

Publicado por FEDERICO (9 intervenciones) el 27/03/2003 16:58:25
En mi funcion DLL quiero recibir como parametro un cadena de caracteres de otro lenguaje. Ej. visual foxpro. Y quiero poder modificar esa cadena. Probe recibir los parametros como pchar pero igual me tira error. Asi esta definida
function wadu(desc, pagi:pchar):integer;stdcall;exports;
depende de desc que la recibo bien debo modificar pagi al ser pchar no tendria que haber problema pero sin embargo o me tira error de memoria o no la modifica

Desde ya, gracias
Saludos Atte.
Federico Gordillo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Cadena de Caracteres en DLL

Publicado por Ernesto D'Spirito (706 intervenciones) el 27/03/2003 17:56:16
A priori, lo único que puedo decirte es que lo más probable es que tu función esté invadiendo un área de memoria a la que no tiene acceso, y que eso puede suceder por un problema con el paso de los parámetros (puede ser un problema de declaración), o porque se te escapó un puntero o un subíndice en la función de la DLL, pero es imposible poder ayudarte si no proporcionas suficientes datos sobre el problema que planteas. Por ejemplo, sería útil ver un extracto del código fuente en VFP donde declaras la función externa y haces la llamada, incluyendo asignación previa y uso posterior de las variables involucradas), y también lógicamente sería útil ver el código fuente de la función de la DLL.

Ernesto D'Spirito
http://www.latiumsoftware.com/es/index.php
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Cadena de Caracteres en DLL

Publicado por FEDERICO (9 intervenciones) el 27/03/2003 18:13:05
Programa en VFP
DECLARE INTEGER callAdedinet IN "CMECONNECT.DLL" STRING, STRING, STRING,STRING,INTEGER
nif = "X2561315N"
edi = "1002.txt"
des = " "
pagina = ""
nro = callAdedinet(nif ,edi, des, pagina )
? NRO
CLEAR ALL DLLS

Codigo de la DLL

function callAdedinet(nif ,edi , pdes ,ppaginahtml:pchar):integer;stdcall;export;
var pru:string;
begin
pru:='prueba';
strpcopy(pdes,pru);
// wadedinet := TOadedinet.Create(nil);
// callAdedinet:= wadedinet.Adedinet(nif ,edi ,pdes,ppaginahtml);
// wadedinet.Free;
End

Esta declarada asi para probar, ya que ese objeto modificara el parametro pdes retornandome un mensaje
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Cadena de Caracteres en DLL

Publicado por FEDERICO (9 intervenciones) el 27/03/2003 18:13:57
y Gracias nuevamente

Federico Gordillo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Cadena de Caracteres en DLL

Publicado por Ernesto D'Spirito (706 intervenciones) el 27/03/2003 22:52:59
OK. Ahora sí. El problema es muy simple.

Como te anticipé antes, tu rutina está escribiendo en un área de memoria en la que no debe, pero en este caso no se debe a un error en al código de la DLL, sino en el código VFP.

Concretamente, la variable 'des' es un string con un solo espacio, o sea un string de tamaño 1, es decir, que sólo puedes escribir un caracter. Lo que tienes que hacer es asignar el tamaño máximo de la variable antes de llamar la función. Lo normal es usar una cadena rellenada con nulos. Por ejemplo:

des = REPLICATE(CHR(0), 256)

Aparte de eso, en la declaración de la función se supone que debes usar 'STRING @' para declarar el parámetro en vez de 'STRING', para indicarle que se trata de un parámetro que se pasa por referencia.

Tras la llamada a la función, si la misma deposita en el parámetro una cadena terminada en nulo, debemos descartar los nulos:

des = STRTRAN(des, CHR(0), "")

Si la función externa devolviera la cantidad de caracteres colocados en el buffer, vamos a suponer que en una variable 'r', entonces tomamos los primeros 'r' caracteres:

des = LEFT(des, r)

Espero que te sirva.

Ernesto D'Spirito
http://www.latiumsoftware.com/es/index.php
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar