Вопрос Подключение .dll по условию

eMission

Мимокрокодил
Здравствуйте.
Подскажите, можно ли подключить dll файл если условие верно, во время выполнения программы. Условием может быть, например, существование указанного файла dll.
Для чего мне это надо? Я использую VCL стили для инсталлятора/деинсталлятора. В установщике dll файлы вшиты в установщик, и всё работает как надо. Но если при запуске деинсталлятора, dll файла не будет на месте то выдаёт ошибку и не даёт удалить программу. Поэтому хотелось бы чтобы при отсутствии библиотеки просто не подключать её. Либо каким то образом вшить её в ехе-шник деинсталлятора.
 

eMission

Мимокрокодил
eMission, функция FileExists
Да, но как эту функцию выполнить в самом начале, до определения всех функций?
Код:
[Code]
// Import the LoadVCLStyle function from VclStylesInno.DLL
procedure LoadVCLStyle(VClStyleFile: String); external 'LoadVCLStyleA@files:VclStylesInno.dll stdcall';
// Import the UnLoadVCLStyles function from VclStylesInno.DLL
procedure UnLoadVCLStyles; external 'UnLoadVCLStyles@files:VclStylesInno.dll stdcall';

procedure LoadVCLStyle_UnInstall(VClStyleFile: String); external 'LoadVCLStyleA@{#VCLStylesDirectory}\VclStylesInno.dll stdcall uninstallonly';
procedure UnLoadVCLStyles_UnInstall; external 'UnLoadVCLStyles@{#VCLStylesDirectory}\VclStylesInno.dll stdcall uninstallonly';
Если сделать так то будет ошибка компиляции
Код:
[Code]
if FileExists('c:\lib.dll') then
begin
// Import the LoadVCLStyle function from VclStylesInno.DLL
procedure LoadVCLStyle(VClStyleFile: String); external 'LoadVCLStyleA@files:VclStylesInno.dll stdcall';
// Import the UnLoadVCLStyles function from VclStylesInno.DLL
procedure UnLoadVCLStyles; external 'UnLoadVCLStyles@files:VclStylesInno.dll stdcall';

procedure LoadVCLStyle_UnInstall(VClStyleFile: String); external 'LoadVCLStyleA@{#VCLStylesDirectory}\VclStylesInno.dll stdcall uninstallonly';
procedure UnLoadVCLStyles_UnInstall; external 'UnLoadVCLStyles@{#VCLStylesDirectory}\VclStylesInno.dll stdcall uninstallonly';
end;
 

Andreo Fadio

Старожил
@eMission,
Код:
[Code]
// Import the LoadVCLStyle function from VclStylesInno.DLL
procedure LoadVCLStyle(VClStyleFile: String); external 'LoadVCLStyleW@files:VclStylesInno.dll stdcall delayload setuponly';
procedure LoadVCLStyle_UnInstall(VClStyleFile: String); external 'LoadVCLStyleW@{#VCLStylesSkinPath}\VclStylesInno.dll stdcall delayload uninstallonly';
// Import the UnLoadVCLStyles function from VclStylesInno.DLL
procedure UnLoadVCLStyles; external 'UnLoadVCLStyles@files:VclStylesInno.dll stdcall delayload setuponly';
procedure UnLoadVCLStyles_UnInstall; external 'UnLoadVCLStyles@{#VCLStylesSkinPath}\VclStylesInno.dll stdcall delayload uninstallonly';

function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('VclStylesInno.dll');
ExtractTemporaryFile('Amakrits.vsf');
LoadVCLStyle(ExpandConstant('{tmp}\Amakrits.vsf'));
Result := True;
end;

procedure DeinitializeSetup();
begin
    UnLoadVCLStyles;
end;

function InitializeUninstall: Boolean;
begin
  Result := True;
  if FileExists(ExpandConstant('{#VCLStylesSkinPath}\VclStylesInno.dll')) and FileExists(ExpandConstant('{#VCLStylesSkinPath}\Amakrits.vsf')) then LoadVCLStyle_UnInstall(ExpandConstant('{#VCLStylesSkinPath}\Amakrits.vsf'));
end;

procedure DeinitializeUninstall();
begin
  if FileExists(ExpandConstant('{#VCLStylesSkinPath}\VclStylesInno.dll')) and FileExists(ExpandConstant('{#VCLStylesSkinPath}\Amakrits.vsf')) then UnLoadVCLStyles_UnInstall;
end;
 
Сверху