¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Solución para llamar a una DLL de VC++ que devuelve un valor char[] en PowerBuilder 11.1 - ¡Ayuda necesaria!

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 69 Vistas
0
Cargando...

¡Hola a todos!

Estoy utilizando PowerBuilder 11.1 build 8123.

Estoy llamando a una DLL de VC++ en nuestra aplicación PowerBuilder que devuelve un valor de tipo de datos char[].

Acabo de declarar la Función Externa Global:-

Function char getOSSectionName() library "DocServClient.dll" alias for "getOSSectionName;Ansi"

Y luego llamo a esta función en la ventana como:-

Char ls_section[1] = 'DOCAPPLICATIONS9X'

ls_section[1]=getOSSectionName()

Cuando verifico el valor de ls_section[1] en el cuadro de mensaje, muestra un símbolo (por favor, revisa la imagen adjunta).

Declaración de la función VC++ y la variable de retorno:-

__declspec(dllexport) char * __stdcall getOSSectionName()

{

char SectionName[_MAX_PATH];

Por favor, avísenme si mi código es válido o no.

Por favor, ayuda...

error.png
Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Cargando...

Comienza de nuevo. ¿Has visto las funciones de API que devuelven bloques de información (cadenas, búferes, etc.)? Por ejemplo, GetComputerName: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724295(v=vs.85).aspx

Existe una razón por la que están estructuradas de esta manera. Tu función no debe presuponer la asignación de memoria y luego "darla" al proceso que llamó a la función. Más bien, el proceso que llama (tu aplicación PB) asignará espacio para el valor de retorno y la longitud de la memoria proporcionada; luego, tu función insertará el valor apropiado en ese búfer y devolverá la longitud del valor proporcionado. Deberás determinar cómo manejar (en tu función DLL) las situaciones en las que el llamante no proporcionó suficiente espacio.

Con respecto a tu código actual - Como Chris sugiere, tu función devuelve una cadena (realmente, un puntero a char). En PB declaraste que la función devolvía un solo char. PB está esperando un char, no un puntero, e interpreta parte del puntero devuelto como un char. Está haciendo exactamente lo que le dijiste que hiciera, desafortunadamente.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

El equivalente en PowerBuilder de un char * es string (si no estás incluyendo caracteres nulos en el retorno) o un blob (si estás incluyendo caracteres nulos). Intenta reemplazar char con string en tu declaración RPCFUNC. Si era un argumento pasado por referencia, necesitarías rellenarlo con espacios (u otros datos) antes de enviarlo. Dado que es un valor de retorno, no necesitas hacer eso.

http://www.sybase.com/detail?id=44648

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Una vez más, un código mal diseñado y escrito que se basa en suposiciones. ¿Qué sucede si desbordas esa cadena en tu función DLL (porque la función no conoce el tamaño del búfer proporcionado)? ¡BOOM! MAX_PATH es mucho más grande que 100 caracteres, y cualquier lógica basada en ese #DEFINE en particular debería estar usando MAXPATH + 1 como el tamaño del búfer asignado.

No veo ninguna razón para convertir entre Unicode y ANSI.

Tampoco hay razón para usar una matriz de caracteres y hacer la copia de caracteres/cadena.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola,

Gracias a todos por sus sugerencias.

He resuelto mi problema al cambiar la función de VC++ a:

Int __declspec(dllexport) __stdcall getOSSectionName(char* SectionName)

en lugar de

__declspec(dllexport) char* __stdcall getOSSectionName()

y declarar la función global como:

Function int getOSSectionName(Ref char ls_section[100]) library "DocServClient.dll" alias for "getOSSectionName;Ansi"

y llamar a la función en la ventana como:

int li_ret

char ls_section[100]

string ls_sec

li_ret=getOSSectionName(REF ls_section)

ls_sec=ls_section

Gracias,

Vikrant

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?