作者:朱金灿

来源:http://blog.csdn.net/clever101

C++调用IDL程序的做法(二)一文中介绍了如何动态创建IDLDrawWidgetControl的做法。假如我们需要在后台中调用IDL程序,又如何动态创建IDLDrawWidget Control呢?今天介绍在一个C++函数里调用IDL函数的做法。

当然在调用IDL程序之前需要以管理员身份注册IDLDrawWidgetControl 3.0。在一个C++函数里调用IDL需要进行一下步骤:

  1. 初始化COM环境,确保能创建IDLDrawWidget Control

  2. 动态创建IDLDrawWidgetControl

  3. 设置设置IDL环境

  4. 给IDL函数传递参数值

  5. 加载IDLpro文件

  6. 调用IDL函数

  7. 关闭com环境

    下面是一个示例函数代码:

    /*
    pszInputFile --- 输入的源图像文件
    pszOutFile --- 输入的结果图像文件
    */
    int CallIDL( const TCHAR* pszInputFile, const TCHAR* pszOutFile )
    { AfxEnableControlContainer(); //确保能创建ActiveX控件
    CoInitialize(NULL); // 初始化com环境 //动态创建ActiveX控件
    CIDLDrawX3 IDLDrawX;
    CWnd *pFrame =CWnd::GetDesktopWindow(); // 获取屏幕窗口作为IDL控件的父窗口 UINT nID = 101;
    RECT rt;
    rt.left = 0;
    rt.right = 100;
    rt.top = 0;
    rt.bottom = 100;
    if (!IDLDrawX.CreateControl(IDLDrawX.GetClsid(), NULL,
    WS_CHILD,rt,pFrame, nID))
    {
    return -1;
    } char strDLLPath[256]={0};
    ::GetModuleFileName(NULL,strDLLPath,256);
    std::string PathName = strDLLPath;
    PathName = PathName.substr(0,PathName.rfind('\\'));
    PathName = PathName.substr(0,PathName.rfind('\\')); // 设置IDL环境
    std::string strIdlDllPath = PathName+ std::string("\\IDL64\\bin\\bin.x86\\idl.dll");
    IDLDrawX.SetIdlPath(strIdlDllPath.c_str());
    IDLDrawX.InitIDL(NULL); //给IDL函数传递参数值
    std::string InFile= pszInputFile;
    _bstr_t bstr(InFile.c_str());
    VARIANT vFileName;
    VariantInit(&vFileName);
    V_VT(&vFileName) = VT_BSTR;
    vFileName.bstrVal = bstr;
    IDLDrawX.SetNamedData("InputPath",vFileName); std::string OutFile= pszOutFile;
    _bstr_t bstrOut(OutFile.c_str());
    VARIANT vOutFileName;
    VariantInit(&vOutFileName);
    V_VT(&vOutFileName) = VT_BSTR;
    vOutFileName.bstrVal = bstrOut;
    IDLDrawX.SetNamedData("OutputPath",vOutFileName); // 加载IDL pro文件
    std::string ProFile= strDLLPath;
    ProFile=ProFile.substr(0,ProFile.rfind('\\')+1);
    ProFile=ProFile+std::string("class_doit_isodata.pro");
    IDLLibPath = PathName + "\\IDL64\\lib\\";
    std::string strFullpath = std::string(".compile '")+IDLLibPath+std::string("class_doit_isodata.pro'");
    long lRet = IDLDrawX.ExecuteStr(strFullpath.c_str());
    // 执行Class_Doit_IsoData函数,Class_Doit_IsoData函数为class_doit_isodata.pro里定义的一个函数
    IDLDrawX.ExecuteStr("retcode = Class_Doit_IsoData(InputPath,OutputPath)"); // 获取执行Class_Doit_IsoData函数的返回值
    VARIANT vRet = IDLDrawX.GetNamedData("retcode"); CoUninitialize(); // 关闭com环境
    return 0;
    }

C++调用IDL程序的做法(三)的更多相关文章

  1. C++调用IDL程序的做法(一)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 IDL是一种数据分析和图像化应用程序及编程语言,先由美国ITT公司所有.最初在七十年代后期用于帮助科学家分析火星探险卫 ...

  2. C++调用IDL程序的做法(二)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 上次提到使用IDLDrawWidget Control 3.0来调用IDL程序,但是我们还有一些问题没有解决,比如C+ ...

  3. Java调用IDL方法总结

    Java调用IDL方法总结 Java调用IDL程序,需要先在java中加载IDL的java包(javaidlb.jar),该包不需要下载,在IDL的安装目录中可以直接找到(C:\Program Fil ...

  4. C/C++程序通过动态链接库调用MATLAB程序

    C/C++程序通过动态链接库调用MATLAB程序 1 MATLAB编译器设置 需要设定对应的C++编译器才能编译.m文件生成可供C++调用的库文件. 在MATLAB命令行输入:mex –setup:然 ...

  5. 小程序学习笔记三:页面文件详解之视图层WXML、WXS、WXSS文件

      视图层:Pages主要有 wxml页面文件和模板文件.wxs脚本文件.wxss样式文件:component是抽取出来的业务单元,同样拥有wxml页面文件和模板文件.wxs脚本文件.wxss样式文件 ...

  6. js调用winform程序(带参数)

    我们会发现,我们点击迅雷下载的时候  网页可以调用应用程序,而且连接会传入迅雷,这个是怎么做到的呢? 原理: 先注册表中添加软件的具体信息,然后通过 href 可以直接调用 1.写入注册表信息,注册, ...

  7. 使用PerfView监测.NET程序性能(三):分组

    在上一篇博客中,我们通过Perfview帮助文件中自带的代码来简单使用了Perfview,了解了基本操作.现在来看看Perfview中的分组操作(Grouping).分组功能都旨将记录到的各种函数调用 ...

  8. 微信小程序把玩(三十三)Record API

    原文:微信小程序把玩(三十三)Record API 其实这个API也挺奇葩的,录音结束后success不走,complete不走,fail也不走, 不知道是不是因为电脑测试的原因,只能等公测或者等他们 ...

  9. 微信小程序把玩(三十六)Storage API

    原文:微信小程序把玩(三十六)Storage API 其实这个存储在新建Demo的时候就已经用到了就是存储就是那个logs日志,数据存储主要分为同步和异步 异步存储方法: 存数据 wx.setStor ...

随机推荐

  1. 让PETSc跑得再快一些

    最近做了一个使用PETSc来求解线性方程组(Ax=b)的项目,把其中遇到的一些坑和解决方法记录下来.本文不介绍PETSc如何入门,而是给出一些能让PETSc运行得更快的编程细节.开始我只是简单地修改P ...

  2. 基于Django+celery二次开发动态配置定时任务 ( 一 )

    需求: 前端时间由于开发新上线一大批系统,上完之后没有配套的报表系统.监控,于是乎开发.测试.产品.运营.业务部.财务等等各个部门就跟那饥渴的饿狼一样需要 各种各样的系统数据满足他们.刚开始一天一个还 ...

  3. odoo开发笔记 -- 异常信息处理汇总

    1 Traceback (most recent call last): File , in _handle_exception return super(JsonRequest, self)._ha ...

  4. GCC C语言 DLL范例,含源码

    作者:小白救星 编译:gcc -c -DBUILDING_HZ_DLL1 hzdll1.c           gcc -shared -o hzdll1.dll hzdll1.o -Wl,--kil ...

  5. Spring Boot启动流程

    基础准备 1,BeanPostProcessor:这个接口的作用在于对于新构造的实例可以做一些自定义的修改.比如如何构造.属性值的修改.构造器的选择等等 2,BeanFactoryPostProces ...

  6. SQL Server性能优化(7)理解数据库文件组织

    一.基本单位"页"     SQL Server是用8KB的页来存储数据.物理I/O操作也是在页级执行.页的种类有很多,具体参考(MSDN).我们关注更多的是数据页的结构,包括三部 ...

  7. Python -----issubclass和isinstance

    issubclass用于判断一个类是否为另一个类的子类,isinstance用于判断一个对象是否某类的一个实例 import math class Point: def __init__(self, ...

  8. Android入门学习总结

    1.Manifest.xml是程序运行时读取的文件,是核心的配置文件:也是从中读取Activity 2.主要的代码文件存放在MainActivity.java,里面固定会有onCreate函数会通过s ...

  9. sql字符处理

    --Description: 字符处理 --使用: 放到查询分析器里执行就可以了 --示例: select * from dbo.splitstr('12 44 45 50 56 87',' ') o ...

  10. rabbitmq 生产环境配置

    目录 一 rabbitmq 生产部署 1.1 rabbitmq.conf 1.2 advanced.config 1.3 rabbitmq-env.conf 1.4 在生产环境中不适用的策略. 一 r ...