在 Inno Setup 中使用 VS C++ 函数

问题描述 投票:0回答:1

我正在尝试用 C++ 为 Inno Setup 安装程序编写的函数替换 LazarusLib 中创建的一些函数。

因此,我在 Visual Studio 中创建了一个动态链接库(DLL)项目并添加了以下代码:

InstallerFunctions.h:

extern "C" {
    __declspec(dllexport) bool __stdcall CheckPortAvailable(int Port);
}

安装程序函数.cpp:

#include "pch.h"
#include "framework.h"
#include "InstallerFunctions.h"
#include <windows.h>
#include <winsock.h>
#include <string>
#include <fstream>

bool __stdcall CheckPortAvailable(int Port) {
    WSADATA WSAData;
    SOCKET Sock;
    sockaddr_in SockAddr;
    int ErrorCode;

    if (WSAStartup(MAKEWORD(2, 2), &WSAData) != 0)
        return false;

    Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (Sock == INVALID_SOCKET)
        return false;

    ZeroMemory(&SockAddr, sizeof(SockAddr));
    SockAddr.sin_family = AF_INET;
    SockAddr.sin_addr.s_addr = INADDR_ANY;
    SockAddr.sin_port = htons(Port);

    ErrorCode = bind(Sock, reinterpret_cast<sockaddr*>(&SockAddr), sizeof(SockAddr));
    closesocket(Sock);

    WSACleanup();

    return (ErrorCode != SOCKET_ERROR);
}

该项目构建成功。该项目配置为将 DLL 文件输出到 \Output\ 然后我将其添加到 Inno Setup 脚本中:

[Files]
Source: "..\InstallerFunctions\Output\InstallerFunctions.dll"; DestDir: "{app}"; Flags: ignoreversion

路径正确。然后我声明该函数如下:

function CheckPortAvailable(Port: Integer): Boolean;
external 'CheckPortAvailable@files:InstallerFunctions.dll stdcall delayload';

当我尝试调用 CheckPortAvailable 时,出现以下错误: 无法调用过程。

我尝试使用DLL资源管理器来查找我需要的函数,DLL资源管理器能够找到这些函数。知道我还能尝试什么吗?

c++ inno-setup dllexport
1个回答
0
投票

我的猜测是,当您调用导出的函数时,您的 .dll 文件不存在于计算机上。

显示安装页面时会处理[文件]部分(即当安装程序处理该部分并复制文件等时)。

我想您之前调用了 .dll 函数,因此您的解决方案可能是在安装程序启动时将 .dll 提取到 Temp 文件夹中,以便导出的函数可用。

© www.soinside.com 2019 - 2024. All rights reserved.