您的位置:首页 > 编程语言 > Delphi

VC调用Delphi对象接口

2014-11-24 21:32 239 查看

说在前头

很久没有碰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的函数入栈/出栈的实现有关吧,希望有知道这块的同学能告诉我下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: