Fórum Sobre try..finally #330484
02/10/2006
0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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...
1 | 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?
1 2 3 4 5 6 7 8 9 10 11 12 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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 :)