¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Solução para chamar uma DLL de VC++ que retorna um valor char[] no PowerBuilder 11.1 - Ajuda necessária!

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

Olá a todos!

Estou usando o PowerBuilder 11.1 build 8123.

Estou chamando uma DLL do VC++ em nossa aplicação PowerBuilder que retorna um valor do tipo char[].

Acabei de declarar a Função Externa Global:-

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

E então chamo essa função na janela como:-

Char ls_section[1] = 'DOCAPPLICATIONS9X'

ls_section[1]=getOSSectionName()

Quando verifico o valor de ls_section[1] na caixa de mensagem, ele exibe um símbolo (por favor, verifique a imagem anexa).

Declaração da função VC++ e da variável de retorno:-

__declspec(dllexport) char * __stdcall getOSSectionName()

{

char SectionName[_MAX_PATH];

Por favor, me avise se meu código é válido ou não.

Por favor, ajuda...

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

4 Respuestas

0
Cargando...

Comece de novo. Você viu as funções de API que retornam blocos de informações (strings, buffers, etc.)? Por exemplo, GetComputerName: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724295(v=vs.85).aspx

Existe uma razão pela qual elas são estruturadas dessa maneira. Sua função não deve pressupor a alocação de memória e então "dar" ao processo que a chamou. Em vez disso, o processo chamador (sua aplicação PB) irá alocar espaço para o valor de retorno e o comprimento da memória fornecida; então, sua função inserirá o valor apropriado nesse buffer e retornará o comprimento do valor fornecido. Você terá que determinar como lidar (em sua função DLL) com situações em que o chamador não forneceu espaço suficiente.

Em relação ao seu código atual - Como Chris sugere, sua função está retornando uma string (na verdade, um ponteiro para char). No PB, você declarou que a função retornava apenas um char. O PB está esperando um char, não um ponteiro, e interpreta parte do ponteiro retornado como um char. Ele está fazendo exatamente o que você disse para fazer, infelizmente.

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

O equivalente em PowerBuilder de um char * é string (se não estiver incluindo caracteres nulos no retorno) ou um blob (se estiver incluindo caracteres nulos). Tente substituir char por string na sua declaração RPCFUNC. Se era um argumento passado por referência, você precisaria preenchê-lo com espaços (ou outros dados) antes de enviá-lo. Como é um valor de retorno, não é necessário fazer isso.

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

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

Mais uma vez, um código mal projetado e escrito que se baseia em suposições. O que acontece se você transbordar essa cadeia em sua função DLL (porque a função não conhece o tamanho do buffer fornecido)? BOOM! MAX_PATH é muito maior que 100 caracteres, e qualquer lógica baseada nesse #DEFINE em particular deveria estar usando MAXPATH + 1 como o tamanho do buffer alocado.

Não vejo nenhuma razão para converter entre Unicode e ANSI.

Também não há motivo para usar uma matriz de caracteres e fazer a cópia de caracteres/cadeia.

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

Olá,

Obrigado a todos pelas suas sugestões.

Resolvi meu problema ao alterar a função do VC++ para:

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

em vez de

__declspec(dllexport) char* __stdcall getOSSectionName()

e declarar a função global como:

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

e chamar a função na janela como:

int li_ret

char ls_section[100]

string ls_sec

li_ret=getOSSectionName(REF ls_section)

ls_sec=ls_section

Obrigado,

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?