Delphi DLL使用接口和调用的方法
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使用接口和调用的方法相关推荐
- 使用vs调用DLL在运行时调用的方法,使用delph调用dll
运行时调用: 1,将*.lib放在和32位debug,release和x64相同的文件夹下,将*.dll放在对应的debug或者release文件夹下: 2,在调用的文件中编写:在声明处编写 typ ...
- Windows下查看dll被哪个进程调用
转载博客菜鸟leihttp://www.cnblogs.com/leipei2352/archive/2013/02/05/2892482.html 卸载程序,结果没卸载干净---程序的安装目录中还剩 ...
- windows下查看dll被哪个进程使用的方法
卸载程序,结果没卸载干净---程序的安装目录中还剩下一个dll文件.想删,结果系统提示说dll文件被某个进程占用了,不让删. 先前碰到这种做法,我都是直接使用unlocker先unlock一下,然后删 ...
- C# 调用 Delphi Dll链接库方法及示例
每种编程语言调用DLL的方法都不尽相同,在此只对用C#调用Delphi DLL的方法进行介绍 首先要搞清楚一点的是:什么是托管,什么是非托管? 一般可以认为:非托管代码主要是基于win 32平台开发的 ...
- python如何调用dll库中的函数_Python调用dll库接口-ctypes方法
背景 最近需要用python写个脚本程序(win10 环境),需要调用现成的dll库完成这项任务,对于一直在Linux平台上开发程序的本人来说,从没有过使用dll的经历(不得不说还是so大法好),遇到 ...
- delphi dll创建及调用
第一章 DLL简单介绍 由于在目前的学习工作中,需要用到DLL文件,就学习了下,在这里作个总结. 首先装简单介绍下DLL: 1,减小可执行文件的大小 DLL技术的产生有很大一部分原因是为了减小可执行文 ...
- Delphi中高级DLL的编写和调用
根据Delphi提供的有关 DLL编写和调用的帮助信息,你可以很快完成一般的 DLL编写和调用的 应用程序.本文介绍的主题是如何编写和调用能够传递各种参数(包括对象实例)的 DLL.例 ...
- cmd 调用webservice接口_c# 三种方法调用WebService接口
1.引用*.wsdl文件 WebService服务端会提供wsdl文件,客户端通过该文件生成.cs文件以及生成.dll. 注意:若服务端只提供的了URL,在URL后面加上"?wsdl&quo ...
- paip 按键精灵调用其它程序及DLL以及EXE命令行的方法
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! paip ...
最新文章
- Python第五课(字典)
- 如何利用vw+rem进行移动端布局
- 消费金融大潮来了,银行必须打出这套进攻+防守的组合拳
- 分享一款颜色神器ColorSchemer Studio
- 输出倒逼输入 加速自己成长
- Cygwin 的代理设置(同 Linux)
- 课堂作业-1成绩汇总
- Adapter中notify(),notifyAll(),notifyDataSetChanged(),notifyDataSetInvalidaded()方法的区别
- 登陆界面万能密码绕过
- 微信指纹锁原理及安全性分析
- 入侵服务器的一种方法
- 用c语言输出一个菱形
- 纯css写一颗跳动的心
- 《墨菲定律》——决策中的学问
- 如何调整DOSBox窗口大小
- 【shell】shell创建虚拟环境virtualenv(-bash: virtualenv: command not found)
- 怎样将语音转化为文字
- IDEA中下方git的提交记录上有黄、绿、紫色标记的意思
- 微信朋友圈如何发已存的小视频
- 系列:iOS开发-开发工具
热门文章
- linux12k8s --> 06Pod详解
- activemq mysql 配置详解_ActiveMQ配置详解
- 批处理禁用无线网服务器,WIN7通过批处理开启/禁用无线网卡的实现过程
- 使用arduino D1 wifi模块(WeMos D1)连接阿里云物联网平台并成功实现APP点亮板载LED(四)---阿里云物联网平台使用基础
- 如何编译typescript文件,在控制台中输出结果
- 一则无限有趣的Android Messages表情小彩蛋
- 关于setCapture和releaseCapture的理解和整理
- nginx—status的使用
- JIRA缺陷管理工具
- 2007-2020年全国各省国有化程度数据