quinta-feira, 3 de janeiro de 2013

Como testar parâmetros do BDE




Inclua na seção uses: BDE, Registry, SysUtils, Windows

uses BDE, Registry;

{ retorna o valor do parâmetro  DLL32, pode validar se é igual a '"SQLORA32.DLL' }

function TBBDEOracleDLL32: String;
const
  BdeKey = 'SOFTWARE\Borland\Database Engine\Settings\DRIVERS\ORACLE\INIT';
  Ident = 'DLL32';
var
  Reg: TRegistry;
begin
  Result := '';
  reg := TRegistry.Create(KEY_READ);
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if Reg.OpenKey(BdeKey, False) then
      if Reg.ValueExists(Ident) then
        Result := UpperCase(Reg.ReadString(Ident)); // = 'SQLORA32.DLL';
  finally
    Reg.Free;
  end;
end;


// A função foi criada para mostrar o resultado da função, mas poderia ser validado o resultado e abortar o // sistema
procedure TForm1.Button1Click(Sender: TObject);
begin

{ Use-a como abaixo: }
//if  then
  { Local Share está TRUE }
  Showmessage('O parametro DLL32 esta parametrizado como '+ TBBDEOracleDLL32);
//else
  { Local Share está FALSE }
//    Showmessage('Diferente DLL32');

end;

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)) );