Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Импорт функций из DLL в скриптах Inno Setup: решение проблемы с Visual Studio 2022

Delphi , Файловая система , DLL и PlugIns

Приветствую, уважаемые разработчики на Delphi и Pascal! В этой статье мы рассмотрим проблему, с которой вы можете столкнуться при импорте функций из динамических библиотек (DLL) в скриптах Inno Setup. Особое внимание будет уделено решению проблемы, возникшей при использовании Visual Studio 2022 для создания DLL.

Проблема

Пользователь столкнулся с ошибкой при попытке импорта функций из собственной DLL в скрипт Inno Setup. Ошибка возникала при вызове функций, созданных в проекте C++ на Visual Studio 2022. В логи Inno Setup было записано, что функции импортированы успешно, но при их вызове происходил сбой.

Контекст проблемы

Вот пример кода, который пользователь использовал в скрипте Inno Setup:

procedure MyDllFunc(hWnd: Integer; lpText, lpCaption: AnsiString; uType: Cardinal);
  external 'MyDllFunc@TestDll.dll stdcall delayload setuponly';

function TestBool() : Boolean;
  external 'TestBool@TestDll.dll stdcall delayload setuponly';

И код функции в DLL:

// dllmain.cpp
#include <windows.h>

void __stdcall MyDllFunc(HWND hWnd, char *lpText, char *lpCaption, UINT uType)
{
    MessageBoxA(hWnd, lpText, lpCaption, uType);
}

bool __stdcall TestBool()
{
    return true;
}

При запуске скрипта Inno Setup возникала ошибка "Runtime error. Line 43: couldn't call proc.".

Подтвержденное решение

Пользователь нашел решение проблемы, которое включает в себя следующие шаги:

  1. Использование режима сборки x86 (32-бит) для создания DLL.
  2. Обрамление кода в директиву extern "C" для обеспечения совместимости с C-синтаксисом.
  3. Добавление ключевого слова __declspec(dllexport) к объявлениям функций.
  4. Использование соглашения о вызовах cdecl в скрипте на Pascal.
  5. Использование ключевого слова files: в пути к DLL.
  6. Убедиться, что в объявлении экспорта используется только один пробел.

Вот исправленный код DLL:

// dllmain.cpp
#include <windows.h>

extern "C"
{
    void __declspec(dllexport) MyDllFunc(HWND hWnd, char *lpText, char *lpCaption, UINT uType)
    {
        MessageBoxA(hWnd, lpText, lpCaption, uType);
    }

    bool __declspec(dllexport) TestBool()
    {
        return true;
    }
}

И исправленный скрипт Inno Setup:

[Files]
Source: "TestDll\Release\TestDll.dll"; Flags: dontcopy;

[Code]
procedure MyDllFunc(hWnd: Integer; lpText, lpCaption: AnsiString; uType: Cardinal);
  external 'MyDllFunc@files:TestDll.dll cdecl delayload setuponly';

function TestBool() : Boolean;
  external 'TestBool@files:TestDll.dll cdecl delayload setuponly';

procedure InitializeWizard;
var
  TestVar: Boolean;
  hWnd: Integer;
begin
  Log('InitializeWizard');
  TestVar := TestBool();
  if TestVar then begin
    Log('TestVar: True');
  end;
  hWnd := StrToInt(ExpandConstant('{wizardhwnd}'));
  MyDllFunc(hWnd, 'Hello from custom DLL function', 'MyDllFunc', MB_OK);
end;

Альтернативный ответ

Помимо вышеуказанных шагов, полезно проверить реальные имена функций в DLL, используя утилиту dumpbin /exports.

Заключение

Импорт функций из DLL в скрипты Inno Setup может быть непростой задачей, особенно когда речь идет о совместимости между C++ проектами и Pascal-скриптами. Следуя приведенным шагам, вы сможете успешно решить проблему и продолжить разработку вашего установщика. Удачи в программировании!

Создано по материалам из источника по ссылке.

Проблема заключается в некорректном импорте функций из DLL, созданной в Visual Studio 2022, в скрипты Inno Setup, что приводит к ошибке при их вызове.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: DLL и PlugIns ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-10 13:06:50/0.024944067001343/1