我在 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/