quinta-feira, 3 de janeiro de 2013

DLL em Delphi 7 pChar para Delphi 2009 PAnsiChar (Mas retorna um caractere)

Antes de você encontrar a parte técnica, é interessante saber o motivo da incompatibilidade entre o Pchar do D7 e D2009. É que o D2009 é Unicode (aceita caracteres especiais, no nosso caso utilizamos o russo e foi somente possível no D2009).


 Ao invés de utilizar pChar na DLL tem que utilizar PAnsiChar.  
è  (Manter a compatibilidade as alterações da DLL foram feitas e compiladas no Delphi 7.0)

A DLL – Declaração da função
Delphi 7.0
//function flGerarSenhaDB(hWnd: HWND; const lpPathPalavraChave, lpDataBase: pChar): pChar; stdcall;
Delphi 2009
function flGerarSenhaDB(hWnd: HWND; const lpPathPalavraChave, lpDataBase: pAnsiChar): pAnsiChar; stdcall; 


Declaração nos Programas que utilizam a DLL

Delphi 7.0
flGerarSenhaDB: function(hWnd: HWND; const lpPathPalavraChave : PChar; lpDataBase: PChar): PChar; stdcall;
Delphi 2009
flGerarSenhaDB: function(hWnd: HWND; const lpPathPalavraChave : PAnsiChar; lpDataBase: PAnsiChar): PAnsiChar; stdcall;

Na declaração a utilização do PAnsiChar, foi suficiente para funcionar. Mas na execução retornava somente 1 (um) caractere foi necessário a utilização da função AnsiString. Bingo funcionou...

Chamada para executar função da DLL
Delphi 7.0
flGerarSenhaDB( Application.Handle, PChar(sPathPalavra), PChar(sNmDataBase) );
Delphi 2009
flGerarSenhaDB(Application.Handle, PAnsiChar(AnsiString(sPathPalavra)), PAnsiChar(AnsiString(sNmDataBase)) );

Um comentário:

  1. Adilson, mto obrigado pelo post :)
    Salvou meu dia, pois me deparei com uma situação semelhante a esta e mesmo lendo e relendo as orientações na web, não estava conseguindo entender e passar os parâmetros de maneira correto para a DLL.

    Abç e sucesso.

    ResponderExcluir