2014-01-29 8 views
3

Мне не повезло импортировать DLL Delphi в программу Inno Setup (Unicode). DLL имеет простую процедуру ..Inno Setup не удалось импортировать DLL

procedure Foo(); stdcall; 
begin 

end; 

exports 
    Foo; 

DLL включен в источнике программы установки и добавлен в список файлов:

[Files] 
Source: "MyDLL.dll"; Flags: dontcopy 

Тогда я достаю этот DLL в инициализации:

function InitializeSetup(): Boolean; 
begin 
    ExtractTemporaryFile('MyDLL.dll'); 
end; 

И, наконец, объявил эту процедуру в сценарии:

function DoFoo(): Bool; 
    external '[email protected] stdcall'; 

Однако, когда я запускаю установку, я получаю сообщение об ошибке:

Cannot Import dll: <utf8>MyDLL.dll. 

Что я делаю неправильно?

+0

Было бы хорошо, если программа установки Inno дал сообщение более описательный ошибки, такие, как, скажем, например, 'File not found MyDLL.dll' –

+0

Это движок Pascal Script вызывает это исключение. Но да, сторона Inno Setup может проверить, существует ли файл в методе события ['CodeRunnerOnDllImport'] (https://github.com/jrsoftware/issrc/blob/is-5_5_4/Projects/Main.pas#L2031) для библиотек которые загружаются при инициализации (не вынуждены задерживать нагрузку). Если библиотека не будет существовать, она сообщит о более разумном сообщении, прекратит установку и больше не будет пытаться импортировать функцию из несуществующего файла библиотеки. Да, такая проверка будет в порядке. – TLama

ответ

7

Поскольку вы не использовали замедленное нагрузку в процессе импорта функции, загрузчик установки Inno не удалось запустить из-за него не нашел вашу библиотеку. Это связано с тем, что проверка наличия экспорта функций выполняется до того, как будет запущено событие InitializeSetup, и поэтому ваша библиотека еще не была извлечена из архива.

В вашем случае добавляется опция delayload импорта. Но вы можете опустить ручной извлечение и сообщить установщику извлечь библиотеку для вас, если вы добавите префикс files: перед именем файла библиотеки. Этот префикс documented как:

During Setup, a special 'files:' prefix may also be used to instruct Setup to automatically extract one or more DLLs from the [Files] section before loading the first DLL.

Весь импорт в вашем случае может быть затем сокращен до:

[Files] 
Source: "MyDLL.dll"; Flags: dontcopy 

[Code] 
procedure Foo; 
    external '[email protected]:MyDLL.dll stdcall'; 
2

Я нашел решение сразу же после публикации этого вопроса с помощью delayload на импорт ...

function DoFoo(): Bool; 
    external '[email protected] stdcall delayload'; 
Смежные вопросы