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

http://blog.csdn.net/peter1983/article/details/2898046

1、C++编写的DLL代码如下:

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

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

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

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

  1. class IAddBase
  2. {
  3. public:
  4. int virtual __stdcall Add(int a, int b) = 0;
  5. };
  6. class IAdd : public IAddBase
  7. {
  8. private:
  9. static Idd* m_Instance;
  10. protected:
  11. IAdd(){}
  12. ~IAdd()
  13. {
  14. if (m_Instance != NULL)
  15. delete m_Instance;
  16. }
  17. public:
  18. int __stdcall Add(int a, int b)
  19. {
  20. return a + b;
  21. }
  22. static IAdd* GetAddInstance()
  23. {
  24. if (m_Instance == NULL)
  25. m_Instance = new Idd();
  26. return m_Instance;
  27. }
  28. };
  29. Idd* IAdd::m_Instance = NULL;
  30. extern "C" __declspec(dllexport) IAddBase* GetAddInstance()
  31. {
  32. return Idd::GetAddInstance();
  33. }

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

 

  1. //在type中声明IAddBase,相当于C++中的.h 文件
  2. Type
  3. IAddBase = class
  4. public
  5. function Add(a, b : Integer):Integer;virtual;stdcall;abstract;
  6. end;
  7. function GetAddInstance : IAddBase ; cdecl ; external 'TestAdd.dll';
  8. var
  9. myAdd : IAddBase;
  10. implemetation
  11. //调用IAddBase中的Add方法
  12. function DoAdd(a,b:Integer):Integer;
  13. begin
  14. myAdd := GetAddInstance;
  15. result := myAdd.Add(a,b);
  16. end;

3、注意的问题

3.1 dll和delphi 定义的类函数需要声明为stdcall,有疑问可以Google关键字:Delphi C++ stdcall

3.2 函数重载问题

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

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

3.3函数定义的顺序

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值