ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Problema com DLL do Delphi XE no Delphi 6 [RESOLVIDO]

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
tiago.prs
Aprendiz
Aprendiz


Registrado: Sábado, 9 de Mai de 2009
Mensagens: 193

MensagemEnviada: Qua Ago 08, 2012 12:09 pm    Assunto: Problema com DLL do Delphi XE no Delphi 6 [RESOLVIDO] Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
casetek
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 13 de Setembro de 2004
Mensagens: 211
Localização: Londrina - PR

MensagemEnviada: Qua Ago 08, 2012 1:56 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
tiago.prs
Aprendiz
Aprendiz


Registrado: Sábado, 9 de Mai de 2009
Mensagens: 193

MensagemEnviada: Qua Ago 08, 2012 2:00 pm    Assunto: Responder com Citação

Sem retorno por página, apenas conexão direta com SOAP.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
casetek
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 13 de Setembro de 2004
Mensagens: 211
Localização: Londrina - PR

MensagemEnviada: Qua Ago 08, 2012 2:24 pm    Assunto: Responder com Citação

Seu webservice é algo parecido com isso?
http://www.devmedia.com.br/construindo-um-webservice-em-java/4516

Se for, e se sua única necessidade é pegar o IP, uma página jsp imprimindo texto puro já resolveria...
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
tiago.prs
Aprendiz
Aprendiz


Registrado: Sábado, 9 de Mai de 2009
Mensagens: 193

MensagemEnviada: Qua Ago 08, 2012 2:27 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
tiago.prs
Aprendiz
Aprendiz


Registrado: Sábado, 9 de Mai de 2009
Mensagens: 193

MensagemEnviada: Qua Ago 08, 2012 2:28 pm    Assunto: Responder com Citação

Só esse pequeno entrave de compatibilidade que está me atrapalhando.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
casetek
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 13 de Setembro de 2004
Mensagens: 211
Localização: Londrina - PR

MensagemEnviada: Qua Ago 08, 2012 2:33 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
tiago.prs
Aprendiz
Aprendiz


Registrado: Sábado, 9 de Mai de 2009
Mensagens: 193

MensagemEnviada: Qua Ago 08, 2012 2:39 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB