views:

105

answers:

1

i have given a chance to my software user to select dll from openfile dialog.(so my user can download dlls form my website and use it with the main project ). everything is working fine and it can even find that dlls is provided by me or selected an invalid dll.but the problem raises if the user selects a renamed file(eg : apple.txt file renamed to apple.dll ). i typed the code like this

try dllHandle := LoadLibrary( pwidechar(openfiledialog1.filename)) ;

catch { showmessage if it is not a dll (but it can be any dll, it checks this is my dll or 3rd party later )}

end;

error message shown by delphi is 'bad library image selected'

but try catch is not working if the user selects invalid dll it is showing its own error message and struck up.

can anyone help me,i am using delphi 2009

+8  A: 

There's no exception to catch because an exception is not raised when LoadLibrary fails; it just returns '0'.

You should check if 'dllHandle' is 0 or not, if it is, show the error information to the user by using GetLastError as documented. Alternatively you can use the Win32Check function in the RTL which will raise an exception with the appropriate error message:

(edit: Documentation of 'LoadLibrary' states that: To enable or disable error messages displayed by the loader during DLL loads, use the SetErrorMode function. So if you don't want the OS to show an additional dialog you'd set the error mode before calling LoadLibrary.)

var
  dllHandle: HMODULE;
  ErrorMode: UINT;
begin
  if OpenDialog1.Execute then begin
    ErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS); // disable OS error messages
    try
      dllHandle := LoadLibrary(PChar(OpenDialog1.FileName));
    finally
      SetErrorMode(ErrorMode);
    end;
    if Win32Check(Bool(dllHandle)) then begin  // exception raised if false
      // use the libary

      end;
  end;
end;
Sertac Akyuz
thanks Sertac Akyuz , i think it works
Vibeeshan
To add to this, LoadLibrary() can alter the FPU control words of the loaded DLL/EXE, so it is better to use SafeLoadLibrary() instead.
Remy Lebeau - TeamB