Delphi对接口采用引用计数的方法管理对象生命周期,但是DLL中输出的对象可能不是被Delphi调用,其引用计数不一定正确,因此DLL中接口对象的生命周期不由Delphi编译器自动生成的代码管理,而是程序员自己控制,所以上面的工厂包括构造和解析两个接口对象的生命周期管理方法。

所有接口对象应该集成自下面的接口,而不应该继承自Delphi自带的TInterfacedObject:

如果在DLL的函数中使用了字符串,还有记得在DLL和调用DLL的工程中单元的首行加入ShareMem,使用ShareMem后在发布执行执行程序是记得包含borlndmm.dll。

(一)DLL源码:

接口定义单元uInf.pas;

unit uInf;

interface

type

TIntObject = class(TObject, IInterface)
  protected
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
  end;

ITest = interface
    ['{0FA49A71-48BF-40CD-9D77-63B233C4F717}']
    function GetMethod: Integer;
  end;

implementation

function TIntObject.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
  if GetInterface(IID, Obj) then
    Result := 0
  else
    Result := E_NOINTERFACE;
end;

function TIntObject._AddRef: Integer;
begin
  Result := -1;
end;

function TIntObject._Release: Integer;
begin
  Result := -1
end;

end.

接口实现单元uDo.pas

unit uDo;

interface

uses Classes, Dialogs, SysUtils, uInf;

type
  TTest = class(TIntObject, ITest)
  public
    function GetMethod: Integer;
  public
    constructor Create;
    destructor Destroy; override;
  end;

function GetITest: ITest;

var
  gTest: TTest;
  
implementation

{ TTest }

constructor TTest.Create;
begin

end;

destructor TTest.Destroy;
begin

inherited;
end;

function TTest.GetMethod: Integer;
begin
  ShowMessage('TTest.GetMethod');
end;

function GetITest: ITest;
begin
  if not Assigned(gTest) then
    gTest := TTest.Create;
  Result := gTest;
end;

initialization
  GetITest();

finalization
  if Assigned(gTest) then
    FreeAndNil(gTest);

end.

执行程序在调用DLL接口时引用接口单元uInf.pas

Proc = function: IInterface;

加载:

var
  P: Proc;
begin
  P := nil;
  myDLLHandle := loadlibrary('Project2.dll');
  P := GetProcAddress(myDLLHandle, 'GetITest');
  FTestObj := ITest(P);
end;

调用:

FTestObj.GetMethod();

释放:

Pointer(FTestObj) := nil;
  FreeLibrary(myDLLHandle);

Delphi DLL使用接口和调用的方法相关推荐

  1. 使用vs调用DLL在运行时调用的方法,使用delph调用dll

    运行时调用: 1,将*.lib放在和32位debug,release和x64相同的文件夹下,将*.dll放在对应的debug或者release文件夹下: 2,在调用的文件中编写:在声明处编写  typ ...

  2. Windows下查看dll被哪个进程调用

    转载博客菜鸟leihttp://www.cnblogs.com/leipei2352/archive/2013/02/05/2892482.html 卸载程序,结果没卸载干净---程序的安装目录中还剩 ...

  3. windows下查看dll被哪个进程使用的方法

    卸载程序,结果没卸载干净---程序的安装目录中还剩下一个dll文件.想删,结果系统提示说dll文件被某个进程占用了,不让删. 先前碰到这种做法,我都是直接使用unlocker先unlock一下,然后删 ...

  4. C# 调用 Delphi Dll链接库方法及示例

    每种编程语言调用DLL的方法都不尽相同,在此只对用C#调用Delphi DLL的方法进行介绍 首先要搞清楚一点的是:什么是托管,什么是非托管? 一般可以认为:非托管代码主要是基于win 32平台开发的 ...

  5. python如何调用dll库中的函数_Python调用dll库接口-ctypes方法

    背景 最近需要用python写个脚本程序(win10 环境),需要调用现成的dll库完成这项任务,对于一直在Linux平台上开发程序的本人来说,从没有过使用dll的经历(不得不说还是so大法好),遇到 ...

  6. delphi dll创建及调用

    第一章 DLL简单介绍 由于在目前的学习工作中,需要用到DLL文件,就学习了下,在这里作个总结. 首先装简单介绍下DLL: 1,减小可执行文件的大小 DLL技术的产生有很大一部分原因是为了减小可执行文 ...

  7. Delphi中高级DLL的编写和调用

            根据Delphi提供的有关 DLL编写和调用的帮助信息,你可以很快完成一般的 DLL编写和调用的 应用程序.本文介绍的主题是如何编写和调用能够传递各种参数(包括对象实例)的 DLL.例 ...

  8. cmd 调用webservice接口_c# 三种方法调用WebService接口

    1.引用*.wsdl文件 WebService服务端会提供wsdl文件,客户端通过该文件生成.cs文件以及生成.dll. 注意:若服务端只提供的了URL,在URL后面加上"?wsdl&quo ...

  9. paip 按键精灵调用其它程序及DLL以及EXE命令行的方法

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! paip ...

最新文章

  1. Python第五课(字典)
  2. 如何利用vw+rem进行移动端布局
  3. 消费金融大潮来了,银行必须打出这套进攻+防守的组合拳
  4. 分享一款颜色神器ColorSchemer Studio
  5. 输出倒逼输入 加速自己成长
  6. Cygwin 的代理设置(同 Linux)
  7. 课堂作业-1成绩汇总
  8. Adapter中notify(),notifyAll(),notifyDataSetChanged(),notifyDataSetInvalidaded()方法的区别
  9. 登陆界面万能密码绕过
  10. 微信指纹锁原理及安全性分析
  11. 入侵服务器的一种方法
  12. 用c语言输出一个菱形
  13. 纯css写一颗跳动的心
  14. 《墨菲定律》——决策中的学问
  15. 如何调整DOSBox窗口大小
  16. 【shell】shell创建虚拟环境virtualenv(-bash: virtualenv: command not found)
  17. 怎样将语音转化为文字
  18. IDEA中下方git的提交记录上有黄、绿、紫色标记的意思
  19. 微信朋友圈如何发已存的小视频
  20. 系列:iOS开发-开发工具

热门文章

  1. linux12k8s --> 06Pod详解
  2. activemq mysql 配置详解_ActiveMQ配置详解
  3. 批处理禁用无线网服务器,WIN7通过批处理开启/禁用无线网卡的实现过程
  4. 使用arduino D1 wifi模块(WeMos D1)连接阿里云物联网平台并成功实现APP点亮板载LED(四)---阿里云物联网平台使用基础
  5. 如何编译typescript文件,在控制台中输出结果
  6. 一则无限有趣的Android Messages表情小彩蛋
  7. 关于setCapture和releaseCapture的理解和整理
  8. nginx—status的使用
  9. JIRA缺陷管理工具
  10. 2007-2020年全国各省国有化程度数据