VC调用Delphi对象接口
说在前头
很久没有碰Delphi的东西了,今天有个朋友让我帮他将一个Delphi中已经实现的功能在VC中进行使用,虽然后来又用VC的方式实现了该功能,但是在实现过程中想到了这样的调用方式,特写下本文以供以后翻阅。
开发环境
本次实践用到了Delphi环境和Delphi环境
VC开发环境
Microsoft Visual Studio 2008 SP1
Delphi开发环境
Borland Delphi7 企业版
实现步骤详解
Delphi实现步骤
1.新建Delphi的DLL工程
打开Delphi,选择File->New->Other->DLL Wizard,然后点击OK确认,将工程名称保存到合适的文件夹内,我这里命名的是Core工程
2.添加实现文件
单击工具栏上的"New Form",并将其文件保存到合适的地方,我这里保存的是frmSample
3.设计导出接口
type
ICore = interface
['{37C17F11-673E-4277-A872-111A340F1F24}']
function GetVersion: PAnsiChar;stdcall;
function GetData: Integer;stdcall;
end;
TCore = class(TInterfacedObject, ICore)
private
data1: integer;
public
function GetVersion: PAnsiChar;stdcall;
function GetData: Integer;stdcall;
end;
// 在implementation下面编写类实现
function TCore.GetVersion: PAnsiChar;stdcall;
begin
Result := 'VERSION: 1.0';
end;
function TCore.GetData: integer;stdcall;
begin
data1 := 1000;
Result := data1;
end;
4.实现导出函数
1.定义导出函数声明
function GetCore:ICore;stdcall;
procedure QueryCore(var coreInf:ICore);stdcall;
2.实现导出函数
procedure QueryCore(var coreInf:ICore);stdcall;
begin
coreInf := TCore.Create as ICore;
end;
function TCore.GetVersion: PAnsiChar;stdcall;
begin
Result := 'VERSION: 1.0';
end;
3.导出函数DLL
在Core文件中写导出函数
exports GetCore, QueryCore;
5.编译生成
按Ctrl+F9,如果没有问题的话即会在当前项目目录下生成Core.dll文件,用depends.exe工具查看,可以看到导出函数QueryCore和GetCore。
VC实现步骤
1.新建工程
新建VS的控制台工程,选择支持MFC(其实不支持也无所谓,就是需要额外包含windows.h文件)
2.编写测试代码
interface DECLSPEC_UUID("37C17F11-673E-4277-A872-111A340F1F24")
ICore : public IUnknown
{
public:
virtual LPCSTR __stdcall GetVersion() = 0;
virtual int __stdcall GetData() = 0;
};
// The one and only application object
CWinApp theApp;
using namespace std;
typedef void (__stdcall* PFN_PPV)(ICore** );
typedef ICore* (__stdcall* PFN_VP)();
void Demo01()
{
const TCHAR szDllFile[] = _T("Core.dll");
HMODULE hModule = LoadLibrary(szDllFile);
if (NULL==hModule)
{
return;
}
PFN_PPV pfnQueryCore = (PFN_PPV)GetProcAddress(hModule, "QueryCore");
PFN_VP pfnGetCore = (PFN_VP)GetProcAddress(hModule, "GetCore");
if (pfnQueryCore)
{
ICore* pCore = NULL;
pfnQueryCore(&pCore);
if (NULL!=pCore)
{
LPCSTR pszVersion = pCore->GetVersion();
printf("1. %s %d\n", pszVersion, pCore->GetData());
pCore->Release();
}
}
if (pfnGetCore)
{
ICore* pCore = pfnGetCore(); // 这里会崩溃
if (NULL!=pCore)
{
LPCSTR pszVersion = pCore->GetVersion();
printf("2. %s %d\n", pszVersion, pCore->GetData());
pCore->Release();
}
}
FreeLibrary(hModule);
}
总结
利用接口形式导出Delphi中的对象给VC用,一般用在VC不想做一些Delphi中已经实现的工作,有时也可以简化一些组件的调用。在上面的示例中,用QueryCore()的形式是一种比较正确的方法,但是对GetCore()函数调用直接崩溃,暂时没有头绪,猜测跟Delphi的函数入栈/出栈的实现有关吧,希望有知道这块的同学能告诉我下。
VC调用Delphi对象接口的更多相关文章
- VC调用Delphi DLL
别的没什么,是一定可以调用成功的.但是意外的是,ShowMessage函数在DLL里也可以轻易被调用.此外,Delphi里的var 相当于VC里的引用,需要在函数原型里正确标识,否则传递普通变量甚至常 ...
- Delphi对象变成Windows控件的前世今生(关键是设置句柄和回调函数)goodx
----------------------------------------------------------------------第一步,准备工作:预定义一个全局Win控件变量,以及一个精简 ...
- 利用消息机制实现VC与Delphi之间的通讯(发送自定义消息)
摘要: 本文介绍了使用Windows消息机制实现由不同语言编制的程序之间的相互通讯.联系,并以当前较为流行的两种语言Microsoft Visual C++ 6.0和Borland delphi 5. ...
- Delphi 的接口机制——接口操作的编译器实现过程(2)
接口对象的内存空间 假设我们定义了如下两个接口 IIntfA 和 IIntfB,其中 ProcA 和 ProcB 将实现为静态方法,而 VirtA 和 VirtB 将以虚方法实现: IIntfA = ...
- Delphi 的接口机制——接口操作的编译器实现过程(1)
学习COM编程技术也快有半个月了,这期间看了很多资料和别人的程序源码,也尝试了用delphi.C++.C#编写COM程序,个人感觉Delphi是最好上手的.C++的模版生成的代码太过复杂繁琐,大量使用 ...
- DELPHI语法基础学习笔记-Windows 句柄、回调函数、函数重载等(Delphi中很少需要直接使用句柄,因为句柄藏在窗体、 位图及其他Delphi 对象的内部)
函数重载重载的思想很简单:编译器允许你用同一名字定义多个函数或过程,只要它们所带的参数不同.实际上,编译器是通过检测参数来确定需要调用的例程.下面是从VCL 的数学单元(Math Unit)中摘录的一 ...
- 基于Delphi的接口编程入门
为什么使用接口? 举个例子好了:有这样一个卖票服务,电影院可以卖票,歌剧院可以卖票,客运站也可以卖票,那么我们是否需要把电影院..歌剧院和客运站都设计成一个类架构以提供卖票服务?要知道,连经理人都可以 ...
- java调用CXF WebService接口的两种方式
通过http://localhost:7002/card/services/HelloWorld?wsdl访问到xml如下,说明接口写对了. 2.静态调用 // 创建WebService客户端代理工厂 ...
- PHP 面向对象编程和设计模式 (1/5) - 抽象类、对象接口、instanceof 和契约式编程
PHP高级程序设计 学习笔记 2014.06.09 什么是面向对象编程 面向对象编程(Object Oriented Programming,OOP)是一种计算机编程架构.OOP 的一条基本原则是计算 ...
随机推荐
- dblink实现不同用户之间的数据表访问
1.dblink 1.创建dblink,如果在用户A下创建dblink,名称为TEST_DBLINK; 去操作GCFR_33用户下的表数据等等, 那么在查询表数据的sql就要加上dblink了.如下是 ...
- windows server 2008使用nginx转发API异常解决办法
公司比较传统,一直使用的JSP做项目,没有遇到过跨域问题. 最近因为公司接到一个微信spa项目,因为考虑到项目需要调用老接口,斗胆选择nginx(1.12.1)做接口转发服务, 开发环境使用的win1 ...
- 解决DEDECMS Call to undefined function dede_htmlspecialchars()
作者:DEDECMS建站网 关注: 3610 时间:2015-11-18 16:39 内容详情 以下内容您可能感兴趣: 织梦官方在2015年6月18日更新了织梦5.7,为了兼容php5.4+,修改了/ ...
- Bootstrap中data-src无法显示图片,但是src可以
在学习bootstrap时,书中的源码是用的data-src来定义图像位置,但是我在使用的时候无法显示图片:data-src可以在img标签中使用来显示图片吗?我使用src可以,而是用data-src ...
- Visio绘制用例图问题集锦
1.Visio画UML用例图没有include关系的解决方法 发现Visio UML用例里面找不到include关系,即"箭头"+"<<include> ...
- MYSQL主从库同步配置过程
MYSQL主从库同步配置过程 为了实现网站数据库的异地备份,采用了MySQL数据库主从同步配置,需要两台服务器分别作为主从库,当主库发生增删改等操作,会实时反映到从库,我的个人服务器配置如下: 主库为 ...
- Java中的对象Object方法之---wait()和notifiy()
这一篇咋们继续,接着来介绍wait()和notify()方法,我们都知道这两个方法和之前介绍的方法不太一样,那就是这两个方法是对象Object上的,不属于Thread类上的.我们也知道这两个方法是实现 ...
- UML图学习之二 类图
类图(ClassDiagrams)是根据系统中的类以及各类之间的关系描述系统的静态视图.类图不仅显示系统内信息的结构,还描述系统内这些信息的行为.类图的一个重要目的是为其他图(如顺序图.交互图)定义一 ...
- .Net cache与cache更新
主要用到 System.Runtime.Caching 框架自动给了一个默认值 MemoryCache.Default; 查看微软关于MemoryCache的介绍,可以看到它有Add.Get.Set ...
- 使用 ServiceAnt 更好地解耦你的程序
今天要厚着脸皮给大家推荐一个自己做的通信中间件--ServiceAnt,目前已经在我们团队的两个产品线上投入了使用. ServiceAnt是什么 它最初的定位是ESB(企业服务总线),但目前还没有达到 ...