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的函数入栈/出栈的实现有关吧,希望有知道这块的同学能告诉我下。相关文章推荐
- Delphi 与 VC 共享接口和对象
- Delphi中调用VC编写的DLL内对象
- Delphi 与 VC 共享接口和对象
- Delphi 与 VC 共享接口和对象
- Delphi 与 VC 共享接口和对象
- C#调用VC dll提供的接口
- vb般的VC++开发(4)--调用IDispatch接口的属性和方法
- VC调用Delphi写的dll的一个问题的处理
- 警告:Delphi 接口引用对象时的陷阱
- VC与Delphi之间动态链接库互相调用
- VC调用ACM音频编程接口压缩Wave音频
- VC调用 JavaScript 难题:如何使当前程序的对象进入脚本
- JavaScript中调用ATL双接口简单对象(无界面的AxtiveX控件)
- Delphi 接口 [转载]Delphi面向对象学习随笔六:接口
- VC调用 JavaScript 难题:如何使当前程序的对象进入脚本
- Inside VCL:接口指针调用函数的时候,如何获得对象指针以完成函数调用?
- Inside VCL:接口指针调用函数的时候,如何获得对象指针以完成函数调用?
- vc和delphi之间动态链接库互相调用_delphi教程
- VC与Delphi之间动态链接库互相调用
- 汉王扫描仪调用接口,delphi代码