Fórum Sobre try..finally #330484
02/10/2006
0
procedure TfrmInscDv.btnCalculaClick(Sender: TObject); var IRet, IOk, IErro, IPar : Integer; LibHandle : THandle; ConsisteInscricaoEstadual : TConsisteInscricaoEstadual; begin try LibHandle := LoadLibrary (PChar (Trim (´DllInscE32.Dll´))); if LibHandle <= HINSTANCE_ERROR then raise Exception.Create (´Dll não carregada´); // @ConsisteInscricaoEstadual := GetProcAddress (LibHandle,´ConsisteInscricaoEstadual´); if @ConsisteInscricaoEstadual = nil then raise Exception.Create(´Entrypoint Download não encontrado na Dll´); // IRet := ConsisteInscricaoEstadual (edtInscricao.Text,edtUF.Text); if Iret = 0 then MessageDlg (´Inscrição válida para ´+edtUf.Text,mtInformation,[mbOk],0) else if Iret = 1 then MessageDlg (´Inscrição inválida para ´+edtUf.Text,mtError,[mbOk],0) else MessageDlg (´Parâmetros inválidos´,mtError,[mbOk],0); edtInscricao.SetFocus; finally FreeLibrary (LibHandle); end; end;
minha dúvida é a seguinte: Se o ´FreeLibrary(LibHandle);´ estivesse logo após o ´edtInscricao.SetFocus´ ele não seria executado da mesma forma que estando dentro do finally? Que seria a diferença se não tivesse esse try..finally e o ´FreeLibrary´ estivesse depois da última linha que atualmente está dentro do ´try´?
Djorius
Curtir tópico
+ 0Posts
02/10/2006
Massuda
O FreeLibrary sempre será executado, mesmo no caso da DLL não ser encontrada ou qualquer outro problema no bloco que vai do try até o finally.
Se o FreeLibrary estivesse na linha imediatamente antes do finally, a DLL só seria descarregada quando tudo desse certo dentro do bloco que vai do try até o finally; nos outros casos, ela permaneceria carregada pelo seu programa.
Gostei + 0
02/10/2006
Djorius
Se refere ao modo como a dll está sendo carregada no código? Se for, eu também não gosto de usar assim e não pretendo usar esse código dessa maneira. Foi só pra exemplificar mesmo.
Agora, deixa eu ver se entendi. Se aquele segundo ´raise´ fosse executado a dll continuaria carregada em memória. Deixando o FreeLibrary dentro do Finally ela será descarregada depois do raise. é isso?
grato pela ajuda.
Gostei + 0
02/10/2006
Massuda
LibHandle := LoadLibrary (PChar (Trim (´DllInscE32.Dll´))); if LibHandle > HINSTANCE_ERROR then ConsisteInscricaoEstadual := GetProcAddress(LibHandle,´ConsisteInscricaoEstadual´); if Assigned(ConsisteInscricaoEstadual) then begin IRet := ConsisteInscricaoEstadual (edtInscricao.Text,edtUF.Text); if Iret = 0 then MessageDlg (´Inscrição válida para ´+edtUf.Text,mtInformation,[mbOk],0) else if Iret = 1 then MessageDlg (´Inscrição inválida para ´+edtUf.Text,mtError,[mbOk],0) else MessageDlg (´Parâmetros inválidos´,mtError,[mbOk],0); if edtInscricao.CanFocus then edtInscricao.SetFocus; FreeLibrary (LibHandle); end else begin // não achou "ConsisteInscricaoEstadual" na DLL end; end else begin // não conseguiu carregar a DLL end;
Mas tem um problema em potencial: se a DLL não foi feita em Delphi e nem usar a DLL BorlandMM.DLL, então esta linha...
IRet := ConsisteInscricaoEstadual (edtInscricao.Text,edtUF.Text);
Gostei + 0
02/10/2006
Djorius
Gostei + 0
02/10/2006
Massuda
Gostei + 0
02/10/2006
Micheus
Não seria mais apropriado deixar a chamada a FreeLibrary (LibHandle) após o end da instrução else?
LibHandle := LoadLibrary (PChar (Trim (´DllInscE32.Dll´))); if LibHandle > HINSTANCE_ERROR then begin ConsisteInscricaoEstadual := GetProcAddress(LibHandle,´ConsisteInscricaoEstadual´); if Assigned(ConsisteInscricaoEstadual) then begin ... else begin // não achou "ConsisteInscricaoEstadual" na DLL end; FreeLibrary (LibHandle); // *** end else begin ...
Gostei + 0
02/10/2006
Massuda
LibHandle := LoadLibrary (PChar (Trim (´DllInscE32.Dll´))); if LibHandle > HINSTANCE_ERROR then ConsisteInscricaoEstadual := GetProcAddress(... if Assigned(ConsisteInscricaoEstadual) then begin IRet := ConsisteInscricaoEstadual (edtInscricao.Text,edtUF.Text); if Iret = 0 then MessageDlg (´Inscrição válida para ´...) else if Iret = 1 then MessageDlg (´Inscrição inválida para ´...) else MessageDlg (´Parâmetros inválidos´,mtError,[mbOk],0); if edtInscricao.CanFocus then edtInscricao.SetFocus; end else begin // não achou "ConsisteInscricaoEstadual" na DLL end; FreeLibrary (LibHandle); end else begin // não conseguiu carregar a DLL end;
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)