zoukankan      html  css  js  c++  java
  • 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
    ", pszVersion, pCore->GetData());
                pCore->Release();
            }
        }
        if (pfnGetCore)
        {
            ICore* pCore = pfnGetCore();    // 这里会崩溃
            if (NULL!=pCore)
            {
                LPCSTR pszVersion = pCore->GetVersion();
                printf("2.   %s   %d
    ", pszVersion, pCore->GetData());
                pCore->Release();
            }
        }
        FreeLibrary(hModule);
    }
    

    总结

    利用接口形式导出Delphi中的对象给VC用,一般用在VC不想做一些Delphi中已经实现的工作,有时也可以简化一些组件的调用。在上面的示例中,用QueryCore()的形式是一种比较正确的方法,但是对GetCore()函数调用直接崩溃,暂时没有头绪,猜测跟Delphi的函数入栈/出栈的实现有关吧,希望有知道这块的同学能告诉我下。

  • 相关阅读:
    我业余时间开发的东西文本编辑器 美丽的控件
    讲讲语言转换程序:将一种语言转换为另一种语言的程序
    调整心态,正确应对所学技术的失宠?(至F#,SL的学习者们)
    开贴说说文本编辑器的那些事情捕获输入内容
    开贴说说文本编辑器的那些事情 字符串的宽度
    电话亭。
    【旅行】西湖——初秋。
    偶这个前端设计师有生以来写过的最复杂的程序业务逻辑(菜鸟贴)。
    “页面制作人员”?“页面工程师”?“页面架构师”?滚一边去!
    【旅行】生的活力——西塘正午。
  • 原文地址:https://www.cnblogs.com/sanghg/p/4119662.html
Copyright © 2011-2022 走看看