博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VC调用Delphi对象接口
阅读量:6999 次
发布时间:2019-06-27

本文共 2821 字,大约阅读时间需要 9 分钟。

说在前头

很久没有碰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 objectCWinApp 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的函数入栈/出栈的实现有关吧,希望有知道这块的同学能告诉我下。

转载于:https://www.cnblogs.com/sanghg/p/4119662.html

你可能感兴趣的文章
美丽的数学家:如果您讨厌数学,这些其实都是人生故事
查看>>
Kettle 中转换(transformation)的执行过程
查看>>
读书笔记-互联网思维阅读10其中一本书《自由》
查看>>
Spark入门实战系列--5.Hive(上)--Hive介绍及部署
查看>>
tomcat设置web根目录
查看>>
CF 444B(DZY Loves FFT-时间复杂度)
查看>>
OCP-1Z0-051-名称解析-文章12称号
查看>>
UVALive 4225 Prime Bases 贪心
查看>>
Oracle B-tree、位图、全文索引三大索引性能比较及优缺点汇总
查看>>
[.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程...
查看>>
【转】java中float与byte[]的互转 -- 不错
查看>>
[Ogre][地形][原创]基于OgreTerrain的地形实现
查看>>
shell登录模式及其相应配置文件(转)
查看>>
Puppet常识梳理
查看>>
web.config配置文件中的configSource属性
查看>>
发现一个国内牛逼的maven仓库,速度真的太快了
查看>>
Snmp配置
查看>>
使用java实现CNN的实战
查看>>
大白话系列之C#委托与事件讲解(二)
查看>>
linux下使用 du查看某个文件或目录占用磁盘空间的大小
查看>>