C++调用IDL程序的做法(三)
作者:朱金灿
来源:http://blog.csdn.net/clever101
在C++调用IDL程序的做法(二)一文中介绍了如何动态创建IDLDrawWidgetControl的做法。假如我们需要在后台中调用IDL程序,又如何动态创建IDLDrawWidget Control呢?今天介绍在一个C++函数里调用IDL函数的做法。
当然在调用IDL程序之前需要以管理员身份注册IDLDrawWidgetControl 3.0。在一个C++函数里调用IDL需要进行一下步骤:
初始化COM环境,确保能创建IDLDrawWidget Control
动态创建IDLDrawWidgetControl
设置设置IDL环境
给IDL函数传递参数值
加载IDLpro文件
调用IDL函数
关闭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程序的做法(三)的更多相关文章
- C++调用IDL程序的做法(一)
作者:朱金灿 来源:http://blog.csdn.net/clever101 IDL是一种数据分析和图像化应用程序及编程语言,先由美国ITT公司所有.最初在七十年代后期用于帮助科学家分析火星探险卫 ...
- C++调用IDL程序的做法(二)
作者:朱金灿 来源:http://blog.csdn.net/clever101 上次提到使用IDLDrawWidget Control 3.0来调用IDL程序,但是我们还有一些问题没有解决,比如C+ ...
- Java调用IDL方法总结
Java调用IDL方法总结 Java调用IDL程序,需要先在java中加载IDL的java包(javaidlb.jar),该包不需要下载,在IDL的安装目录中可以直接找到(C:\Program Fil ...
- C/C++程序通过动态链接库调用MATLAB程序
C/C++程序通过动态链接库调用MATLAB程序 1 MATLAB编译器设置 需要设定对应的C++编译器才能编译.m文件生成可供C++调用的库文件. 在MATLAB命令行输入:mex –setup:然 ...
- 小程序学习笔记三:页面文件详解之视图层WXML、WXS、WXSS文件
视图层:Pages主要有 wxml页面文件和模板文件.wxs脚本文件.wxss样式文件:component是抽取出来的业务单元,同样拥有wxml页面文件和模板文件.wxs脚本文件.wxss样式文件 ...
- js调用winform程序(带参数)
我们会发现,我们点击迅雷下载的时候 网页可以调用应用程序,而且连接会传入迅雷,这个是怎么做到的呢? 原理: 先注册表中添加软件的具体信息,然后通过 href 可以直接调用 1.写入注册表信息,注册, ...
- 使用PerfView监测.NET程序性能(三):分组
在上一篇博客中,我们通过Perfview帮助文件中自带的代码来简单使用了Perfview,了解了基本操作.现在来看看Perfview中的分组操作(Grouping).分组功能都旨将记录到的各种函数调用 ...
- 微信小程序把玩(三十三)Record API
原文:微信小程序把玩(三十三)Record API 其实这个API也挺奇葩的,录音结束后success不走,complete不走,fail也不走, 不知道是不是因为电脑测试的原因,只能等公测或者等他们 ...
- 微信小程序把玩(三十六)Storage API
原文:微信小程序把玩(三十六)Storage API 其实这个存储在新建Demo的时候就已经用到了就是存储就是那个logs日志,数据存储主要分为同步和异步 异步存储方法: 存数据 wx.setStor ...
随机推荐
- 插入排序(java)
这星期java老师布置的作业就是实现几种常见的排序算法,由于数据结构学了丢得差不多了,今天晚上搞了一晚上才搞出来插入排序的三种算法. 首先说个与题目不搭的话,今天写
- 安装SVN并进行汉化的详细步骤
安装SVN并进行汉化的详细步骤 SAE提供了不同的代码部署方式,可以分为两类:一是通过SVN客户端部署,这是SAE推荐的代码部署方法.另一个是通过非SVN客户端部署,即在线代码在线编辑器和推荐应用安装 ...
- (转)python-user-agents
原文:http://blog.topspeedsnail.com/archives/1958 Python3网络爬虫(四):使用User Agent和代理IP隐藏身份-------https://bl ...
- MySQL笔记(2)---InnoDB存储引擎
1.前言 本节记录InnoDB的相关知识点. 2.InnoDB存储引擎简介 2.1版本 MySQL5.1开始,允许用动态方式加载引擎,这样存储引擎的更新可以不受MySQL数据库版本的限制.下面是各个I ...
- ElasticSearch入门3: Spring Boot集成ElasticSearch
第一步:创建项目elasticsearch 编写pom文件 <?xml version="1.0" encoding="UTF-8"?> <p ...
- Python爬虫实战四之抓取淘宝MM照片
原文:Python爬虫实战四之抓取淘宝MM照片其实还有好多,大家可以看 Python爬虫学习系列教程 福利啊福利,本次为大家带来的项目是抓取淘宝MM照片并保存起来,大家有没有很激动呢? 本篇目标 1. ...
- rpm 软件包管理
rpm---Redhat Pachage Manager 挂载光盘: [root@localhost sdb1]# mount /dev/sr0 /mnt [root@localhost sdb1]# ...
- Spring总结 3.AOP(xml)
本随笔内容要点如下: 什么是AOP AOP术语解释 Spring中AOP的xml实现 一.什么是AOP AOP(Aspect Oriented Programming),即面向切面编程.那什么是面向切 ...
- 复刻smartbits的国产网络测试工具minismb-如何测试DPI引擎
复刻smartbits的网络性能测试工具MiniSMB,是一款专门用于测试智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此以太网测试工具测试任何ip网络设备的端口吞吐率,带宽,并发 ...
- 大佬带你深入浅出Lua虚拟机
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由鹅厂优文发表于云+社区专栏 作者:郑小辉 | 腾讯 游戏客户端开发高级工程师 写在前面:本文所有的文字都是我手工一个一个敲的,以及本文 ...