gpt4 book ai didi

c++ - 在 Delphi 中使用 C++ .DLL 中的函数

转载 作者:太空狗 更新时间:2023-10-29 20:06:37 27 4
gpt4 key购买 nike

我正在尝试从 Delphi 中的“近似最近邻”(ANN) 库访问各种函数(实际上,它是 Lazarus/FreePascal,但这应该无关紧要)。

这是 C++ 中的减速:

#include <cstdlib>                      // C standard lib defs
#include <ANN/ANNx.h> // all ANN includes
#include <ANN/ANNperf.h> // ANN performance

using namespace std; // make std:: accessible
....
....
void annMaxPtsVisit( // set limit on max. pts to visit in search
int maxPts) // the limit
{
ANNmaxPtsVisited = maxPts;
}

这是我尝试从 Lazarus 中访问 annMaxPtsVisit 函数的尝试(如果您不知道 Lazarus 是什么,请假装它是 delphi):

unit unit1;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
type

{ TForm1 }

TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure annMaxPtsVisit(input:Integer); stdcall;
private

{ private declarations }
public
{ public declarations }

end;

var
Form1: TForm1;

implementation

{$R *.lfm}
{ TForm1 }
procedure TForm1.annMaxPtsVisit(input: Integer); stdcall; external 'ANN.dll' name 'annMaxPtsVisit';

procedure TForm1.Button1Click(Sender: TObject);
begin
annMaxPtsVisit(10);
end;

end.

程序可以编译,但是当我尝试执行它时,我收到一条错误消息:

“无法在动态链接库 ANN.dll 中找到过程入口点 annMaxPtsVisit”

如果有人能帮我解决这个问题,我将不胜感激。

以下是 DLL 的导出:

class ANNsampStat ann_average_err   
class ANNsampStat ann_rank_err
const ANNbd_tree::`vftable'
const ANNbruteForce::`vftable'
const ANNkd_tree::`vftable'
const ANNpointSet::`vftable'
double * * __cdecl annAllocPts(int,int)
double * __cdecl annAllocPt(int,double)
double * __cdecl annCopyPt(int,double *)
double __cdecl annDist(int,double *,double *)
protected: void __thiscall ANNkd_tree::SkeletonTree(int,int,int,double * *,int *)
public: __thiscall ANNbd_tree::ANNbd_tree(class ANNbd_tree const &)
public: __thiscall ANNbd_tree::ANNbd_tree(class std::basic_istream<char,struct std::char_traits<char> > &)
public: __thiscall ANNbd_tree::ANNbd_tree(double * *,int,int,int,enum ANNsplitRule,enum ANNshrinkRule)
public: __thiscall ANNbd_tree::ANNbd_tree(int,int,int)
public: __thiscall ANNbruteForce::ANNbruteForce(class ANNbruteForce const &)
public: __thiscall ANNbruteForce::ANNbruteForce(double * *,int,int)
public: __thiscall ANNkd_tree::ANNkd_tree(class ANNkd_tree const &)
public: __thiscall ANNkd_tree::ANNkd_tree(class std::basic_istream<char,struct std::char_traits<char> > &)
public: __thiscall ANNkd_tree::ANNkd_tree(double * *,int,int,int,enum ANNsplitRule)
public: __thiscall ANNkd_tree::ANNkd_tree(int,int,int)
public: __thiscall ANNpointSet::ANNpointSet(class ANNpointSet const &)
public: __thiscall ANNpointSet::ANNpointSet(void)
public: __thiscall ANNsampStat::ANNsampStat(void)
public: class ANNbd_tree & __thiscall ANNbd_tree::operator=(class ANNbd_tree const &)
public: class ANNbruteForce & __thiscall ANNbruteForce::operator=(class ANNbruteForce const &)
public: class ANNkd_tree & __thiscall ANNkd_tree::operator=(class ANNkd_tree const &)
public: class ANNpointSet & __thiscall ANNpointSet::operator=(class ANNpointSet const &)
public: class ANNsampStat & __thiscall ANNsampStat::operator=(class ANNsampStat const &)
public: double __thiscall ANNsampStat::max(void)
public: double __thiscall ANNsampStat::mean(void)
public: double __thiscall ANNsampStat::min(void)
public: double __thiscall ANNsampStat::stdDev(void)
public: int __thiscall ANNsampStat::samples(void)
public: virtual __thiscall ANNbd_tree::~ANNbd_tree(void)
public: virtual __thiscall ANNbruteForce::~ANNbruteForce(void)
public: virtual __thiscall ANNkd_tree::~ANNkd_tree(void)
public: virtual __thiscall ANNpointSet::~ANNpointSet(void)
public: virtual double * * __thiscall ANNbruteForce::thePoints(void)
public: virtual double * * __thiscall ANNkd_tree::thePoints(void)
public: virtual int __thiscall ANNbruteForce::annkFRSearch(double *,double,int,int *,double *,double)
public: virtual int __thiscall ANNbruteForce::nPoints(void)
public: virtual int __thiscall ANNbruteForce::theDim(void)
public: virtual int __thiscall ANNkd_tree::annkFRSearch(double *,double,int,int *,double *,double)
public: virtual int __thiscall ANNkd_tree::nPoints(void)
public: virtual int __thiscall ANNkd_tree::theDim(void)
public: virtual void __thiscall ANNbruteForce::annkSearch(double *,int,int *,double *,double)
public: virtual void __thiscall ANNkd_tree::annkSearch(double *,int,int *,double *,double)
public: virtual void __thiscall ANNkd_tree::Dump(enum ANNbool,class std::basic_ostream<char,struct std::char_traits<char> > &)
public: virtual void __thiscall ANNkd_tree::getStats(class ANNkdStats &)
public: virtual void __thiscall ANNkd_tree::Print(enum ANNbool,class std::basic_ostream<char,struct std::char_traits<char> > &)
public: void __thiscall ANNkd_tree::`default constructor closure'(void)
public: void __thiscall ANNkd_tree::annkPriSearch(double *,int,int *,double *,double)
public: void __thiscall ANNsampStat::operator+=(double)
public: void __thiscall ANNsampStat::reset(void)
void __cdecl annClose(void)
void __cdecl annDeallocPt(double * &)
void __cdecl annDeallocPts(double * * &)
void __cdecl annMaxPtsVisit(int)
void __cdecl annPrintStats(enum ANNbool)
void __cdecl annResetCounts(void)
void __cdecl annResetStats(int)
void __cdecl annUpdateStats(void)

最佳答案

也许按索引导入:

procedure annMaxPtsVisit(input: Integer); stdcall; external 'ANN.dll' index 39;

(这是通过Dependecy Walker得到的索引)

并且您可能必须更改为 cdecl 调用约定,具体取决于 DLL 的构建方式:

procedure annMaxPtsVisit(input: Integer); cdecl; external 'ANN.dll' index 39; // could work

编辑:看起来 cdecl 是正确的做法,查看您添加的导出。

Edit2:如@user786653 所怀疑的那样,Dependency walker 还显示了装饰名称。这似乎也有效:

procedure annMaxPtsVisit(input: Integer); cdecl; external 'ANN.dll' Name '?annMaxPtsVisit@@YAXH@Z';

虽然看起来很丑。

关于c++ - 在 Delphi 中使用 C++ .DLL 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7029531/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com