作者:朱金灿

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

上次提到使用IDLDrawWidget Control 3.0来调用IDL程序,但是我们还有一些问题没有解决,比如C++程序如何把参数传递给IDL函数,比如IDLDrawWidget Control 3.0是否需要一个对话框来放置。今天我们谈谈如何解决这些问题。

首先谈谈参数传递的问题。IDLDrawWidgetControl 3.0是一个COM组件,因此C++程序要把参数值传递给IDL程序,先要构造一个Com类型变量,把参数值传给它,然后通过IDLDrawWidget Control 3.0的接口把Com类型变量传递给IDL程序的函数变量。下面以最常用的字符串类型和整型来说明:

	// 将字符串传递给IDL函数,下面INIT_ENVI.sav里面有一个INIT_ENVI函数
std::string strIDLPath = PathName + std::string("\\IDL70");
_bstr_t bstr(strIDLPath.c_str());
// 构造一个COM类型变量vFileName
VARIANT vFileName;
VariantInit(&vFileName);
V_VT(&vFileName) = VT_BSTR;
vFileName.bstrVal = bstr;
// 定义一个IDL变量IDLPath,将vFileName传给它
m_IDLDrawX.SetNamedData("IDLPath",vFileName); // 加载INIT_ENVI.sav
std::string strProPath = m_IDLLibPath + std::string("INIT_ENVI.sav");
std::string strFullpath = std::string("restore,'")+strProPath+std::string("'");
long lRet = m_IDLDrawX.ExecuteStr(strFullpath.c_str());
// 执行INIT_ENVI函数
m_IDLDrawX.ExecuteStr("INIT_ENVI,IDLPath");
// 将整型传递给IDL函数,下面resample.sav里面有一个resample函数
VARIANT vPersent;
VariantInit(&vPersent);
V_VT(&vPersent) = VT_I4;
vPersent.lVal =50;
m_IDLDrawWidget.SetNamedData("nPersent", vPersent);
strProPath = m_IDLLibPath + std::string("resample.sav");
std::string strFullpath = std::string("restore,'")+strProPath+std::string("'"); m_IDLDrawX.ExecuteStr(strFullpath.c_str()); // 执行resample函数
m_IDLDrawX.ExecuteStr("resample, nPersent");

其次谈谈是否需要一个对话框来放置IDLDrawWidget Control 3.0控件,答案是不用的,因为IDLDrawWidgetControl 3.0控件可以动态创建,其动态创建和初始化代码如下:

	CWnd *pFrame = AfxGetMainWnd();
// 注意这里必须有一个父窗口,可以是框架窗口,窗口风格设为WS_CHILD即可
if (!m_IDLDrawX.CreateControl(m_IDLDrawX.GetClsid(), NULL,
WS_CHILD,rt,pFrame, nID))
{
return -1;
} std::string strIdlDllPath = PathName+ std::string("\\IDL70\\bin\\bin.x86\\idl.dll");
m_IDLDrawX.SetIdlPath(strIdlDllPath.c_str());
m_IDLDrawX.InitIDL(NULL);

执行动态创建和初始化代之后你就可以任意调用IDLDrawWidget Control 3.0控件的接口了。

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

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

     作者:朱金灿 来源:http://blog.csdn.net/clever101 在C++调用IDL程序的做法(二)一文中介绍了如何动态创建IDLDrawWidgetControl的做法.假如我 ...

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

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

  3. Java调用IDL方法总结

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

  4. Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(二)

    如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数: double add(double x, double y) { return x + y; } 现在我想要在Matlab中使用它,比 ...

  5. 汇编语言程序入门实验二:在dos下建立子目录操作

    汇编语言程序入门实验二:在dos下建立子目录操作 1,背景 在读此文,并读懂前,建议读者先阅读这两篇博客 1,在dos环境下汇编语言程序设计入门(输出hello world)和masm32的下载.安装 ...

  6. C#调用java程序

    前言: 最近跟项目组的人合作一个项目,由于之前我用的是java写的一个与android通信的程序,现在另一个同事来编写界面程序,由于C#编写起来比较方便,而我又不想重新写之前java的那段代码,于是需 ...

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

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

  8. 使用PerfView监测.NET程序性能(二):Perfview的使用

    在上一篇博客中,我们了解了对Windows及应用程序进行性能分析的基础:Event Trace for Windows (ETW).现在来看看基于ETW的性能分析工具——Perfview.exe Pe ...

  9. Java调用Python程序

    最近,需要在应用中,需要使用Java程序去调用Python代码,主要有两种实现方式. 一.使用Jython架包 因为调用的Python代码中需要使用Json对象,开始使用jython2.5.2,发现不 ...

随机推荐

  1. RMAN冷备份、一致性备份脚本

    RMAN冷备份.一致性备份脚本 run{ shutdown immediate; startup mount; allocate channel c1 type disk; allocate chan ...

  2. HTTP--Request Headers及Cookies

    简介: HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者POST).如有必要,客户程序还可以选择发送其他的请求头.大多数请求头并不是必需的,但Content-L ...

  3. docker基础(二)

    1.base镜像的特点 (1)不依赖于其他的镜像 (2)其它的可以通过它位基础作为容器的底层 2.在下载镜像的时候,只有几百M,但是安装一个Ubuntu虚拟机的镜像就比较大,首先会想到图形化界面,其实 ...

  4. vue-cli 构建vue项目

    师父说,咱们还是要用vue-cli 去构建前端项目.然后我就开始了 懵逼之旅. 今天上午主要就是搞懂用webpack和vue-cli怎么搭建 运行项目 首先找到了咱们博客园 园友的博客,提供了大概五个 ...

  5. Android多线程研究(8)——Java中的原子性理解

    一.什么是原子性 原子性是世界上最小单位,具有不可分割性.比如a=0;(a非long和double类型)这个操作是不可分割的,那么我们说这个操作是原子操作.再比如:a++;这个操作实际上是a=a+1; ...

  6. 【BZOJ 4518】[Sdoi2016]征途

    [链接] 链接 [题意] 在这里输入题意 [题解] DP+斜率优化; \(D(x) = E(x^2)-E(x)^2\) 其中\(E(x)^2\)这一部分是确定的. 因为总长是确定的,分成的段数又是确定 ...

  7. Yarn架构基本概况(一)

    1)引言 针对MRv1在扩展性.可靠性,资源利用率和多框架的支持上存在着明显的不足.进而诞生了下一代的MapReduce的计算框架MapReduce Version2,MRV1中有一个非常大的问题就是 ...

  8. 在vue中使用babel-polyfill

    在 Vue.js项目中使用Vuex,Vuex 依赖 Promise,所以如果你的浏览器没有实现 Promise (比如 IE),那么就需要使用一个 polyfill 的库 我们可以通过babel-pr ...

  9. 数据类型总结——Array(数组类型)

    相关文章 简书原文:https://www.jianshu.com/p/1e4425383a65 数据类型总结——概述:https://www.cnblogs.com/shcrk/p/9266015. ...

  10. 改变HTML中超链接的显示样式 分类: C1_HTML/JS/JQUERY 2014-08-27 10:11 595人阅读 评论(0) 收藏

    更详细的内容请参考:http://www.w3school.com.cn/tags/tag_a.asp HTML中的代码如下: <a class="news_title" t ...