使用Delphi调用C++编写的DLL

Dll的功能比较简单,就是实现一个整数加法;

IAddBase 是一个抽象类,IAdd实现了IAddBase的方法,并采用了单例模式;

GetAddInstance()dll对外的接口,返回一个IAdd的对象指针;

调用者使用该实例就可以调用Add方法

class IAddBase

{

public:

       virtual int __stdcall Add(int a, int b) = 0;

};

class IAdd : public IAddBase

{

private:

static IAdd *m_Instance;

protected:

IAdd()

{}

public:

int __stdcall Add(int a, int b)

{

return a + b;

}

int cdecl Sub(int a, int b)

{

       returna – b;

}

static IAdd* GetAddInstance()

{

if (m_Instance == NULL)

m_Instance = new IAdd();

return m_Instance;

}

};

IAdd * IAdd::m_Instance = NULL;

extern "C" __declspec(dllexport) IAddBase* GetAddInstance()

{

return Idd::GetAddInstance();

}

Delphi下调用该Dll,这里采用静态调用方法

//type中声明IAddBase,相当于C++中的.h 文件

Type

IAddBase = class

public

// stdcall必须书写在virtualabstract中间,否则编译会报错

function Add(a, b: Integer):Integer;virtual;stdcall;abstract;

function Sub(a, b: Integer): Integer;virtual;cdecl ;abstract;

end;

function GetAddInstance : IAddBase ;cdecl ; external 'TestAdd.dll';

var

myAdd : IAddBase;

implemetation

//调用IAddBase中的Add方法

function DoAdd(a,b:Integer):Integer;

begin

myAdd := GetAddInstance;

result := myAdd.Add(a,b);

end;

3、注意的问题

3.1 dlldelphi 定义的类函数可以声明为stdcall/cdecl,有疑问可以Google关键字:Delphi C++ stdcall

3.2 函数重载问题

如果在c++dll中定义了一个具有相同函数名的类,则在Delphi中无法保证调用正确的函数,这里要指出的是即使在定义时

声明该函数为overload也无法保证正确调用dll中的对应函数

3.3 函数定义的顺序

Delphi中定义的类函数的顺序必须和C++ .h文件中定义的类函数顺序保持一致,否则调用将会出错。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值