Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
tiago.prs Aprendiz
Registrado: Sábado, 9 de Mai de 2009 Mensagens: 193
|
Enviada: Qua Ago 08, 2012 12:09 pm Assunto: Problema com DLL do Delphi XE no Delphi 6 [RESOLVIDO] |
|
|
Saudações caros !
Será que alguém poderia me ajudar ?
Fiz uma DLL no Delphi XE para obter o IP do usuário por meio de um WebService SOAP Java, para então utilizá-la em uma aplicação feita no Delphi 6.
Tive de fazer a DLL em Delphi XE porque a importação do WSDL no delphi 6 não foi capaz de compatibilizar, melhor, não foi capaz de entender o wsdl do WebService Java e criou uma unit totalmente fora do que realmente deveria ser. Já no Delphi XE criou a Unit para requisição do serviço tranquilamente.
Mesmo eu criando a interface do serviço, no Delphi 6, e tentando consumir diretamente por SOAP em vez de utilizar o arquivo wsdl não foi possível para o Delphi 6 obter o retorno do WebService.
A unit criada pelo Delphi XE não é compatível com o Delphi 6, então resolvi criar essa DLL no Delphi XE para consumir na aplicação feita em Delphi 6.
Estou agora estou com o seguinte problema:
Preciso obter o retorno da função da DLL.
A função da DLL está declarada com o seu retorno em PChar. Mas ao ler por meio de uma aplicação no Delphi 6 eu não consigo o retorno. Mas em uma aplicação em Delphi XE eu consigo o retorno da função da DLL sem problemas.
Me parece que a dificuldade está na compatibilidade do PChar no Delphi XE com o do Delphi 6.
Está em um padrão diferente, como por exemplo:
Se o IP é 111.222.333.444, então a DLLFunction retorna apenas '1'.
Tentei pelo Evaluate/Modify ( Menu: Run / Evaluate/Modify ou Ctrl+F7 ) visualizar o que estava ocorrendo, e tratando como se fosse um vetor, colocando como DLLFunction[1], DLLFunction[2] ... achei algo como: 1#01#01#0.#02#02 ...
Minha DLL
Código: |
Library DTWS;
Uses
SysUtils,
Classes,
UntIPInfo in 'UntIPInfo.pas';
{$R *.res}
Function GetIPWeb: PChar; Export; Stdcall;
Begin
Result := PChar( GetIPInfo.getIP );
End;
Exports
GetIPWeb;
Begin
End.
|
Leitura no Delphi 6
Código: |
Function GetIPWeb: String;
Type
TDLLFunction = Function(): Pchar;
var
DLLFunction: TDLLFunction;
DLLHandle: THandle;
Begin
Result := '';
DLLHandle := LoadLibrary( PChar( ExtractFilePath(Application.ExeName) + 'DTWS.dll' ) );
If ( DLLHandle = 0 ) Then Exit;
Try
DLLFunction := GetProcAddress(DLLHandle, 'GetIPWeb');
If Assigned(DLLFunction) Then
Result := DLLFunction;
Finally
FreeLibrary(DLLHandle);
End;
End;
|
Desde já, grato pela atenção!
Editado pela última vez por tiago.prs em Qua Ago 08, 2012 2:42 pm, num total de 2 vezes |
|
Voltar ao Topo |
|
|
casetek Aprendiz
Registrado: Segunda-Feira, 13 de Setembro de 2004 Mensagens: 211 Localização: Londrina - PR
|
Enviada: Qua Ago 08, 2012 1:56 pm Assunto: |
|
|
Citação: | Mesmo eu criando a interface do serviço, no Delphi 6, e tentando consumir diretamente por SOAP em vez de utilizar o arquivo wsdl não foi possível para o Delphi 6 obter o retorno do WebService. |
Não sei se entendi o que você precisa e estou falando besteira, mas você tentou utilizar o componente TIdHTTP da paleta Indy?
strRetorno:= IdHTTP1.Get('http://servidor/pagina.jsp');
Se abrir a pagina.jsp no navegador ela mostra o endereço ip? Se sim, a variável strRetorno também terá o resultado em forma de String. |
|
Voltar ao Topo |
|
|
tiago.prs Aprendiz
Registrado: Sábado, 9 de Mai de 2009 Mensagens: 193
|
Enviada: Qua Ago 08, 2012 2:00 pm Assunto: |
|
|
Sem retorno por página, apenas conexão direta com SOAP. |
|
Voltar ao Topo |
|
|
casetek Aprendiz
Registrado: Segunda-Feira, 13 de Setembro de 2004 Mensagens: 211 Localização: Londrina - PR
|
|
Voltar ao Topo |
|
|
tiago.prs Aprendiz
Registrado: Sábado, 9 de Mai de 2009 Mensagens: 193
|
Enviada: Qua Ago 08, 2012 2:27 pm Assunto: |
|
|
Eu já vi alguns exemplos com TIdHTTP.
Mas o tempo de resposta é muito lento.
Preciso de algo mais rápido, e o WebService veio a calhar. |
|
Voltar ao Topo |
|
|
tiago.prs Aprendiz
Registrado: Sábado, 9 de Mai de 2009 Mensagens: 193
|
Enviada: Qua Ago 08, 2012 2:28 pm Assunto: |
|
|
Só esse pequeno entrave de compatibilidade que está me atrapalhando. |
|
Voltar ao Topo |
|
|
casetek Aprendiz
Registrado: Segunda-Feira, 13 de Setembro de 2004 Mensagens: 211 Localização: Londrina - PR
|
Enviada: Qua Ago 08, 2012 2:33 pm Assunto: |
|
|
O tempo de resposta depende mais do servidor do que do TIdHTTP.
Eu também trabalho com aplicativos web em PHP. Com requisições a sites hospedados em servidores compartilhados (kinghost.com.br) , mesmo consultando banco de dados, o tempo de resposta dificilmente é maior do que 100ms(milisegundos) |
|
Voltar ao Topo |
|
|
tiago.prs Aprendiz
Registrado: Sábado, 9 de Mai de 2009 Mensagens: 193
|
Enviada: Qua Ago 08, 2012 2:39 pm Assunto: |
|
|
Entendi... Então quando eu fiz os testes, muito provável que eu estava tendo problemas é com o servidor HTTP.
Mas... Bom, acabei de resolver meu problema.
Na verdade, precisei apenas acrescentar o UTF8Decode dentro da DLL.
Assim:
Código: |
Library DTWS;
Uses
SysUtils,
Classes,
UntIPInfo in 'UntIPInfo.pas';
{$R *.res}
Function GetIPWeb: PChar; Export; Stdcall;
Begin
Result := PChar( UTF8Decode(GetIPInfo.getIP) );
End;
Exports
GetIPWeb;
Begin
End.
|
Destacando o procedimento:
Código: |
Function GetIPWeb: PChar; Export; Stdcall;
Begin
Result := PChar( UTF8Decode(GetIPInfo.getIP) );
End;
|
Com o UTF8Decode eu consegui fazer com que a DLL pudesse passar a String em um formato possível de ler para o Delphi 6.
Grato pela ajuda! |
|
Voltar ao Topo |
|
|
|