c++ - 无法在 Delphi : The procedure entry point could not be located 中使用 DLL(用 C++ 编写)

标签 c++ delphi dll dllimport

我在 Visual Studio 中编译了一个 DLL(源代码是 C++,我几乎看不懂)。这是一段 Scraper.h:

struct SWin
{
   char title[512];
   HWND hwnd;
};

SCRAPER_API bool ScraperGetWinList(SWin winList[100]);

现在我正尝试在我的 Delphi 应用程序中使用上述函数:

type
  tWin = record
    title: String;
    hwnd: HWND;
  end;

function ScraperGetWinList(var WinList: Array of tWin): Boolean; external 'Scraper.dll';

var
  myWinList: Array [1..100] of tWin;

procedure TMainForm.GetWinListButtonClick(Sender: TObject);
begin
  ScraperGetWinList(myWinList);
  ...

项目未编译,我收到以下消息:无法在动态链接库中找到过程入口点 ScraperGetWinList:Scraper.dll

我做错了什么?

最佳答案

根据我的 Linux 经验,我会说您遇到了所谓的“name-mangling”问题。您的程序的入口点不称为“ScraperGetWinList”,而是类似“_ZN18ScraperGetWinListEpN4SWin”的名称。

问题是,与 C 不同,在 C++ 语言中,入口点的名称与函数名称不同。难怪:假设您有一组重载函数;它们在您的 DLL 中应该有不同的入口点。这就是名称修改发挥作用的地方。

这个问题最常见的解决方案是以使用 C 调用约定的方式定义库的接口(interface)。这样接口(interface)函数就不会发生名称重整。

请注意,您不必用 C 语言编写整个库,您只需声明函数,让它们发出类似 C 语言的入口点。

一般是这样写的:

extern "C" {

SCRAPER_API bool ScraperGetWinList(SWin winList[100]);
// More functions

}

重新编译你的库并在 Delphi 中使用它没有问题。

注意,您还应该调整调用约定(stdcall 或 cdecl)以使其在您的 C++ header 和 Delphi 代码中匹配。但是,最好在另一个问题中对此进行解释。

关于c++ - 无法在 Delphi : The procedure entry point could not be located 中使用 DLL(用 C++ 编写),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1584421/

相关文章:

c++ - “类形状”没有名为 ‘info’ 的成员,但添加一个也不起作用

java - 通过蓝牙将超声波传感器的数据从 Arduino 发送到 Android

delphi - 如何维护主从客户端数据集Delphi中的排序顺序?

delphi - 将 VirtualTreeView 编辑器移动到第二列

c++ - MFC DLL 的 GUI 线束?

c# - 在 EXE 中嵌入外部 DLL

c++ - if 语句中的函数名以一种奇怪的方式转换

c++ - Xcode 中的 Flex、Bison、C++

json - 修改 SuperObject 以不同的方式格式化/缩进 JSON 字符串?

delphi - 如何在 Delphi 中使用 "Native Wifi API"Windows API 函数