我正在尝试用 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资源管理器能够找到这些函数。知道我还能尝试什么吗?
我的猜测是,当您调用导出的函数时,您的 .dll 文件不存在于计算机上。
显示安装页面时会处理[文件]部分(即当安装程序处理该部分并复制文件等时)。
我想您之前调用了 .dll 函数,因此您的解决方案可能是在安装程序启动时将 .dll 提取到 Temp 文件夹中,以便导出的函数可用。