vc中调用c#其他应用程序的方法.doc_第1页
vc中调用c#其他应用程序的方法.doc_第2页
vc中调用c#其他应用程序的方法.doc_第3页
vc中调用c#其他应用程序的方法.doc_第4页
vc中调用c#其他应用程序的方法.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess简介:这是vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess的详细页面,介绍了和函数,有关的知识,谢谢大家的观看!要查看更多有关信息,请点击此处三个sdk函数:winexec,shellexecute,createprocess可以实现调用其他程序的要求,其中以winexec最为简单,shellexecute比winexec灵活一些,createprocess最为复杂。winexec两个参数,前一个指定路径,后一个指定显示方式。shellexecute可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,shellexecute还可以打开网页,启动相应的邮件关联发送邮件等等。createprocess一共有十个参数,不过大部分都可以用null代替,它可以指定进程的安全属性,继承信息,类的优先级等等。如果我们要得到足够多的关于新的进程的信息,控制新的进程的细节属性,若要达到这些目的,我们就需要使用createprocess函数了。 和vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess有关的c#、、c+编程小帖士:strongCallByName (object, procname, usecalltype,args() 执行一个对象的方法、设定或传回对象的属性。 三个sdk函数(winexec、shellexec、crateprocess)的语法:winexec这个函数最简单,只有两个参数,原型如下:uintwinexec(lpcstrlpcmdline,/命令路径uintucmdshow/显示方式screen.width/2)this.style.width=screen.width/2; border=0;使用方法如下:winexec(notepad.exe,sw_show);/打开记事本winexec(d:programfilestesttest.exe,sw_showmaximized);/以最大化的方式打开test.exe需要注意的是若用sw_showmaxmized方式去加载一个无最大化按钮的程序,譬如neterm,calc等等,就不会出现正常的窗体,但是已经被加到任务列表里了。shellexecute原型如下:hinstanceshellexecute(hwndhwnd,/父窗口句柄lpctstrlpoperation,/操作,打开方式edit,explore,open,find,print,nulllpctstrlpfile,/文件名,前面可加路径lpctstrlpparameters,/参数lpctstrlpdirectory,/默认文件夹intnshowcmd/显示方式);使用方法如下:shellexecute(null,open,c:test.txt,null,null,sw_shownormal);/打开c:test.txt文件shellexecute(null,open,,/ null,null,sw_shownormal);/打开网页shellexecute(null,explore,d:c+,null,null,sw_shownormal);/打开目录d:c+shellexecute(null,print,c:test.txt,null,null,sw_hide);/打印文件c:test.txtshellexecute不支持定向输出。createprocess原型如下:boolcreateprocess(lpctstrlpapplicationname,/执行程序名lptstrlpcommandline,/参数行/下面两个参数描述了所创建的进程和线程的安全属性,如果为null则使用默认的安全属性lpsecurity_attributeslpprocessattributes,/processsecurityattributeslpsecurity_attributeslpthreadattributes,/threadsecurityattributesboolbinherithandles,/继承标志dworddwcreationflags,/创建标志lpvoidlpenvironment,/环境变量lpctstrlpcurrentdirectory,/运行该进程的初始目录lpstartupinfolpstartupinfo,/用于在创建子进程时设置各种属性lpprocess_informationlpprocessinformation/用于在进程创建后接受相关信息screen.width/2)this.style.width=screen.width/2; border=0;使用方法如下:process_informationpi;startupinfosi;memset(&si,0,sizeof(si);si.cb=sizeof(si);si.wshowwindow=sw_show;si.dwflags=startf_useshowwindow;boolfret=createprocess(d:putty.exe,null,null,false,null,null,null,null,&si,&pi);可以看出,通过上面的几个不同的方法,都可以实现在应用程序中打开其他应用程序的目的,其中有些方法可能会麻烦一点,所以就需要我们根据不同的目的去选择最适合自己的方法去实现自己的目的!关于三个sdk函数:winexec,shellexecute,createprocess的其他注意事项:1、定义头文件在头文件stdafx.h中必须定义以下两个头文件:#include/可替换为windows.h#include如果定义了头文件#include的话就不必定义#include了,windows.h不光是包含了shellapi.h,它还定义了许多数据类型,如果没有这些数据类型,shellapi.h本身会出错。2、定义路径c+中所表示的路径要用而不是平常所用的,所以以上三个函数表示路径都为:disk:directory.filenamewinexec(d:programfilestesttest.exe,sw_showmaximized);shellexecute(null,open,c:test.txt,null,null,sw_shownormal);boolfret=createprocess(d:putty.exe,null,null,false,null,null,null,null,&si,&pi);C#.Net 中实现自己的COM组件目前各种开发工具种类众多,为了更多的重用已经设计好的功能模块,COM组件就是一中很好的方式。要在Visual C#.net 中生成一个COM组件是非常方便的。一个COM组件应该包含接口定义和该接口的实现。然后生成DLL,并使用命令regasm filename.DLL /tlb:filename.tlb 手工产生注册类型库*.tlb。将该tlb导入到调用该COM的程序以便调用它。制作步骤:1、在Visual C#.net 中选择“文件-新建-项目-类库”取名为TestCOM。2、在项目中定义接口,并实现接口对象。namespace TestCOMpublic interface IMyDll string Hello(string Name);public class MyDll:IMyDll public string Hello(string name) return hello+name; 3、在该项目上单击鼠标右键选择“属性”也中配置属性里的“生成”项中的“为COM Interop注册”设置为“true”。4、然后生成项目。在Debug目录下将看见TestCOM.tlb。简单的COM组件就生成了。VC+中调用C#.Net生成的COM组件的实现在VC+中进行组件调用的步骤(以TestCOM.tlb为例):1、导入类型库tlb #import “TestCOM.tlb”2、初始化COM以及产生智能指针 (一般是在需要调用COM组件中提供的方法时就需要产生指向该接口的智能指针)CoInitialize(NULL);/初始化COMTestCOM:IMyDllPtr p(_uuidof(TestCOM:MyDll);/名字空间:接口Ptr p(_uuidof(名字空间:类)TestCOM:IMyDll * Test=p;/名字空间:接口 指向接口的智能指针3、调用COM中的方法 _bstr_t m_string=”World!”; /传入参数 _bstr_t str=Test- Hello(m_string);/调用Hello方法4、释放环境 CoUninitialize()基于C#.Net 的MDI框架设计摘要:本文通过一个具体的例子来详细的介绍在Visual C#.Net环境下构建MDI框架的方法。多文档界面(Multi Document Interface MDI)是现在软件开发中常用的框架结构,C#.Net 是微软公司开发的新程序开发语言,本文讲述MDI窗口的属性设计以及MDI子窗口的创建和现实,同时给出菜单合并的设置方法。关键字:C# .Net MDI 多文档界面 1、引言 MDI就是所谓的多文档界面,他是微软公司从Windows 2.0下的Microsoft Excel电子表格程序开始引入的,Excel电子表格用户有时需要同时操作多份表格,MDI正好为这种操作多表格提供了很大的方便,于是就产生了MDI程序。 Visual C#是微软公司推出的下一代主流程序开发语言,他也是一种功能十分强大的程序设计语言,正在受到越来越多的编程人员的喜欢。在Visual C#中,提供了为实现MDI程序设计的很多功能。本文就是通过一个具体的例子来详细的介绍在Visual C#中的MDI编程。 2、 程序设计及运行的环境 (1)Windows 2000 Advanced Server (2)Visual Studio .Net 2003 中文版3、 程序设计的思路 (1)MDI编程主要是生成框架主窗口 (2)在主窗口中创建若干新的MDI子窗口 (3)对主窗口中的MDI子窗口进行排列控制 (4)将主窗口中已有的MDI子窗口自动添加到指定菜单项中 (5)菜单项合并设置4、程序设计及其实现 (1)首先要将主窗体设定为一个MDI窗体的容器,因为只有如此才能够在此主窗体上面添加MDI子窗体,从而实现对MDI编程,具体实现语句如下: this.IsMdiContainer = true ; /设置主窗体的IsMdiContainer属性为true,可设计时设置也可运行时设置。 (2)在主窗体中新建一个MDI窗体。 通常情况下,新建一个MDI子窗体的命令是通过触发一个菜单的事件来实现的(比如,新建. ,打开.)。在处理新建一个MDI子窗体事件中,关键是要设定此MDI子窗体的父窗体。其实MDI窗体和别的窗体没有什么不同,不同点就在MDI窗体有上一级窗体,即父窗体,而其他窗体是没有的,具体实现语句(单击新建菜单项触发的事件)如下: private void New_Click ( object sender , EventArgs e )/这是一个菜单的事件 Form frmTemp = new Form ( ) ; /新建一个窗体对象,可根据需要新建自己设计的窗体 frmTemp.MdiParent = this ; /设置窗口的MdiParent属性为当前主窗口,成为MDI子窗体 frmTemp.Text = 窗体0 + FormCount.ToString ( ) ; /设定MDI窗体的标题 FormCount+ ; /FormCount是定义在主程序中的一个变量来记录产生的子窗口个数frmTemp.Show ( ) ; /把此MDI窗体显示出来 (3)对MDI子窗体的排列 在主窗体中实现对MDI子窗体的排列操作,可以在主程序中通过主窗口的方法LayoutMdi来实现,他所带的参数是由枚举型MdiLayout所列举的几种排列类型,包括层叠Cascade 水平平铺 TileHorizoatal 垂直平铺 TileVertical 重新排列 ReArrange。具体实现语句如下: private void Cascade_Click ( object sender , EventArgs e ) / MDI窗体的层叠操作 this.LayoutMdi ( MdiLayout.Cascade ) ; private void TileH_Click ( object sender , EventArgs e ) / MDI窗体的水平平铺操作 this.LayoutMdi ( MdiLayout.TileHorizontal ) ; private void TileV_Click ( object sender , EventArgs e ) / MDI窗体的垂直平铺操作 this.LayoutMdi ( MdiLayout.TileVertical ) ; private void ArrangeIcon_Click ( object sender , EventArgs e ) / MDI窗体排列图标操作 this.LayoutMdi ( MdiLayout.ArrangeIcon ) ; (4)在菜单项中列出MDI子窗口的名称。 在有些MDI程序,当新建一个MDI窗体以后,往往会在某些菜单项的下面生产一个以此MDI窗体的名称为名称的子菜单项。在Visual C#中实现此种功能,就显得比较简单的,只有在要加入的主菜单项下加入下面一句程序或者对设置该主菜单项的MdiList属性就可以了:WindowMenu.MdiList = true ; 本程序中,是在窗口主菜单项下面加入MDI窗体的子菜单项的,主窗口内的子窗体在“窗口”菜单中被跟踪。 (5)子窗口菜单与主窗口菜单合并 如果 MDI 子窗体有一个 MainMenu 组件(其菜单结构通常为包含菜单项的菜单结构),并且该子窗体是在一个拥有 MainMenu 组件(其菜单结构通常为包含菜单项的菜单结构)的 MDI 父窗体中打开的,那么在设置了 MergeType 属性(作为可选项,还可以设置 MergeOrder 属性)之后,这两个菜单项会自动合并。5. 总结本文主要是介绍如何用Visual C#来实现对MDI窗体的编程。即:新建MDI窗体、MDI窗体层叠、MDI窗体水平平铺、MDI窗体的垂直平铺。通过上述介绍,可见,在Visual C#中处理MDI还是相当比较简单的VC+ 调用 C#生成DLL的两种方法VisualC、Delphi或者VB等编程语言来编写的DLL文件,在编译完成以后,产生DLL文件已经是一个可以直接供计算机使用的二进制文件,而Visual C#生成的DLL不是独立运行的程序,是某个程序的一个部分,只能由所属的程序调用,用户不能也不需要打开它,Visual C#编译器生成的托管代码虽然也是二进制文件,但不是可以直接供计算机使用的原始代码,实际上是一种中间语言(IL)代码,需要经过下一代窗口服务( Next Generation Windows Services,简写为NGWS ) runtime的即时编译器(即JIT)进行编译。用Visual C#生成的DLL文件已经和以前的DLL文件有了本质上的区别。用Visual C#生成的DLL文件在程序设计中更多的表现为一种类(Class)或者类库(Class Library)。 如果想在VC+的非托管代码中调用已经用VC#生成的托管的DLL,从两个方向进行调整可以产生两种办法:(visual studio 2008)(下面方法都是对于同一平台下,即C#跟VC+都是在windows平台下)一、对VC+的环境中进行修改使其支持托管代码: vc+调用端增加公共语言运行时【clr】的支持以执行C#的程序:解决方案-Properties(右键)-Configuration Properties(展开左树)-General(打开子节点)-Common Language Runtime support(选中选项)-【Common Language Runtime support(/clr)】(选中) OK,现在就可以引入托管的动态连接库来用了,不过在调用时还是得注意语法(new-gcnew,.),例如下: #include stdafx.h #using SmartDeviceDLL.dll using namespace SmartDeviceDLL; int _tmain(int argc, _TCHAR* argv) printf(1111111111111n); SmartDeviceDLL:ICalculator pICalc=gcnew SmartDeviceDLL:Class1(); long lResult =0; lResult=pICalc-Add(5,10); wprintf(Lthe result is %dn,lResult); printf(222222222222222222n); char c; scanf(%c,&c); return 0; 二、C#生成DLL端编译成COM接口,供VC+以托管格式调用(命令的运行都是在visual studio command prompt (命令窗口)中)1.新建一个C#的动态连接库(在 模板 ,下单击 类库): using System; using System.Linq; using System.Collections.Generic; using System.Text; namespace SmartDeviceDLL public interface ICalculator int Add(int Number1, int Number2); public class Class1: ICalculator public int Add(int Number1, int Number2) return Number1 * Number2; public static int TestMethod(String s) Console.WriteLine(Managed assembly: 0, s); return s.Length; 2.为程序集创建一个强命名的类库,并在AssemblyInfo.cs文件中用AssemblyKeyFile属性指向它: 1)、使用强命名工具(Strong Name Utility)产生密钥对: sn -k MyKeyFile.snk 2)、在AssemblyInfo.cs文件中用AssemblyKeyFile属性指向它: 即在项目的文件AssemblyInfo.cs中将assembly: ComVisible(false)用以下内容替换: assembly: ComVisible(true) assembly: AssemblyDelaySign(false) assembly: AssemblyKeyFile(MyKeyFile.snk) /指向刚生成的文件(可用无汉字的绝对路径) 3)、重新编译,产生的程序集就是经过签名后的程序集了 3.把生成的库文件加入全局程序集缓存(Global Assembly Cache, .NET CompactFramework支持一个工具,通常位于:CWndowsAssembly下)以便可以从任何 COM 客户端激活它,可以使用工具GACUtil.exe,指定/i命令开关将一个程序集安装到GAC中,同样可以使用/u命令开关将一个程序集从GAC中卸载。注意:安装的程序集必须是强命名程序集: GACUTIL /i SmartDeviceDLL.dll /可用SmartDeviceDLL.dll的绝对路径,Wince平台直接在命令窗口中用CGACUTIL(Compact) 4.用下面的命令为COM注册刚才的程序集,生成COM库文件(程序集注册工具读取程序集中的元数据,并将所需的项添加到注册表中,注册表允许 COM 客户程序以透明方式创建 .NET Framework 类。类一经注册,任何 COM 客户程序都可以使用它,就好像该类是一个 COM 类。类仅在安装程序集时注册一次。程序集中的类实例直到被实际注册时,才能从 COM 中创建) /下面命令注册 SmartDeviceDLL.dll 中包含的所有公共类,并生成和注册类型库 SmartDeviceDLL.tlb,该类型库包含 SmartDeviceDLL.dll 中定义的所有公共类型的定义 REGASM SmartDeviceDLL.dll /tlb:SmartDev

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论