2024年1月22日发(作者:)

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++编程小帖士:

strong>CallByName (object, procname, usecalltype,[args()

]) 执行一个对象的方法、设定或传回对象的属性。

三个sdk函数( winexec、shellexec、crateprocess )的语法:

winexec

这个函数最简单,只有两个参数,原型如下:

uint winexec(

lpcstr lpcmdline, // 命令路径

uint ucmdshow// 显示方式

/2)=/2;" border=0>;

使用方法如下:

winexec("", sw_show); // 打开记事本

winexec("d:program ",sw_showmaximized); // 以最大化的方式打开

需要注意的是若用 sw_showmaxmized 方式去加载一个无最大化按钮的程序,譬如neterm,calc 等等,就不会出现正常的 窗体,但是已经被加到任务列表里了。

shellexecute

原型如下:

hinstance shellexecute(

hwnd hwnd, //父窗口句柄

lpctstr lpoperation, //操作, 打开方式 "edit","explore","open","find","print","null"

lpctstr lpfile, //文件名,前面可加路径

lpctstr lpparameters, //参数

lpctstr lpdirectory, //默认文件夹

int nshowcmd //显示方式

);

使用方法如下:

shellexecute(null,"open","c:",null,null,sw_shownormal); // 打开c: 文件

shellexecute(null, "open", "",/

shellexecute(null,"explore", "d:c++",null,null,sw_shownormal); // 打开目录d:c++

shellexecute(null,"print","c:",null,null, sw_hide); // 打印文件c:

shellexecute不支持定向输出。

createprocess

原型如下:

bool createprocess(

lpctstr lpapplicationname, //执行程序名

lptstr lpcommandline, // 参数行

//下面两个参数描述了所创建的进程和线程的安全属性,如果为null则使用默认的安全属性

lpsecurity_attributes lpprocessattributes, // process security attributes

lpsecurity_attributes lpthreadattributes, // thread security attributes

bool binherithandles, // 继承标志

dword dwcreationflags, // 创建标志

lpvoid lpenvironment, // 环境变量

lpctstr lpcurrentdirectory, // 运行该进程的初始目录

lpstartupinfo lpstartupinfo, // 用于在创建子进程时设置各种属性

lpprocess_information lpprocessinformation //用于在进程创建后接受相关信息

/2)=/2;" border=0>;

使用方法如下:

process_information pi;

startupinfo si;

memset(&si,0,sizeof(si));

=sizeof(si);

indow=sw_show;

s=startf_useshowwindow;

bool fret=createprocess("d:",null,null,false,null,null,null,null,&si,&pi);

可以看出,通过上面的几个不同的方法,都可以实现在应用程序中打开其他应用程序的目的,其中有些方法可能会麻烦一点,所以就需要我们根据不同的目的去选择最适合自己的方法去实现自己的目的!

关于三个sdk函数: winexec, shellexecute,createprocess 的其他注意事项:

1、定义头文件

在头文件stdafx.h中必须定义以下两个头文件:

#include // 可替换为 windows.h

#include

null, null, sw_shownormal); // 打开网页

如果定义了头文件 #include 的话就不必定义 #include 了,"windows.h" 不光是包含了"shellapi.h",它还定义了许多数据类型,如果没有这些数据类型,shellapi.h本身会出错。

2、定义路径

c++中所表示的路径要用 " "而不是平常所用的" ",所以以上三个函数表示路径都为:

file name

winexec("d:program ",sw_showmaximized);

shellexecute(null,"open","c:",null,null,sw_shownormal);

bool fret=createprocess("d:",null,null,false,null,null,null,null,&si,&pi);

C#.Net 中实现自己的COM组件

目前各种开发工具种类众多,为了更多的重用已经设计好的功能模块,COM组件就是一中很好的方式。要在Visual C#.net 中生成一个COM组件是非常方便的。

一个COM组件应该包含接口定义和该接口的实现。然后生成DLL,并使用命令regasm

/tlb: 手工产生注册类型库*.tlb。将该tlb导入到调用该COM的程序以便调用它。

制作步骤:

1、在Visual C#.net 中选择“文件-〉新建-〉项目-〉类库”取名为TestCOM。

2、在项目中定义接口,并实现接口对象。

namespace TestCOM

{

public interface IMyDll

{

 string Hello(string Name);

}

public class MyDll:IMyDll

 {

 public string Hello(string name)

 {

 return "hello"+name;

 }

 }

}

3、在该项目上单击鼠标右键选择“属性”也中配置属性里的“生成”项中的“为COM

Interop注册”设置为“true”。

4、然后生成项目。在Debug目录下将看见。简单的COM组件就生成了。

VC++中调用C#.Net生成的COM组件的实现

在VC++中进行组件调用的步骤(以为例):

1、导入类型库tlb

 #import “”

2、初始化COM以及产生智能指针

 (一般是在需要调用COM组件中提供的方法时就需要产生指向该接口的智能指针)

CoInitialize(NULL);//初始化COM

TestCOM::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编程,具体实现语句如下:

ontainer = true ; //设置主窗体的IsMdiContainer属性为true,可设计时设置也可运行时设置。

(2)在主窗体中新建一个MDI窗体。

通常情况下,新建一个MDI子窗体的命令是通过触发一个菜单的事件来实现的(比如,新建... ,打开...)。在处理新建一个MDI子窗体事件中,关键是要设定此MDI子窗体的父窗体。其实MDI窗体和别的窗体没有什么不同,不同点就在MDI窗体有上一级窗体,即父窗体,而其他窗体是没有的,具体实现语句(单击新建菜单项触发的事件)如下:

private void New_Click ( object sender , EventArgs e )//这是一个菜单的事件 {

Form frmTemp = new Form ( ) ; //新建一个窗体对象,可根据需要新建自己设计的窗体

ent = this ; //设置窗口的MdiParent属性为当前主窗口,成为MDI子窗体

= "窗体0" + ng ( ) ; //设定MDI窗体的标题

FormCount++ ; //FormCount是定义在主程序中的一个变量来记录产生的子窗口个数

( ) ; //把此MDI窗体显示出来

} (3)对MDI子窗体的排列

在主窗体中实现对MDI子窗体的排列操作,可以在主程序中通过主窗口的方法LayoutMdi

来实现,他所带的参数是由枚举型MdiLayout所列举的几种排列类型,包括层叠Cascade 水平平铺 TileHorizoatal 垂直平铺 TileVertical 重新排列 ReArrange。

具体实现语句如下:

private void Cascade_Click ( object sender , EventArgs e ) // MDI窗体的层叠操作

{

Mdi ( e ) ;

}

private void TileH_Click ( object sender , EventArgs e ) // MDI窗体的水平平铺操作

{

Mdi ( rizontal ) ;

} private void TileV_Click ( object sender , EventArgs e ) // MDI窗体的垂直平铺操作

{

Mdi ( rtical ) ;

}

private void ArrangeIcon_Click ( object sender , EventArgs e ) // MDI窗体排列图标操作

{

Mdi ( eIcon ) ;

}

(4)在菜单项中列出MDI子窗口的名称。

在有些MDI程序,当新建一个MDI窗体以后,往往会在某些菜单项的下面生产一个以此MDI窗体的名称为名称的子菜单项。在Visual C#中实现此种功能,就显得比较简单的,只有在要加入的主菜单项下加入下面一句程序或者对设置该主菜单项的MdiList属性就可以了:t = 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 ""

using namespace SmartDeviceDLL;

int _tmain(int argc, _TCHAR* argv[])

{

printf("11n");

SmartDeviceDLL::ICalculator ^pICalc=gcnew SmartDeviceDLL::Class1();

long lResult =0;

lResult=pICalc->Add(5,10);

wprintf(L"the 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 ;

using c;

using ;

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)

{

ine("Managed assembly: [0]", s);

return ;

}

}

}

2.为程序集创建一个强命名的类库,并在文件中用AssemblyKeyFile属性指向它:

1)、使用强命名工具(Strong Name Utility)产生密钥对:

sn -k

2)、在文件中用AssemblyKeyFile属性指向它:

即在项目的文件中将[assembly: ComVisible(false)]用以下内容替换:

[assembly: ComVisible(true)]

[assembly: AssemblyDelaySign(false)]

[assembly: AssemblyKeyFile("")] //指向刚生成的文件(可用无汉字的绝对路径)

3)、重新编译,产生的程序集就是经过签名后的程序集了

3.把生成的库文件加入全局程序集缓存(Global Assembly Cache, .NET [Compact]Framework支持一个工具,通常位于:CWndowsAssembly下)以便可以从任何 COM 客户端激活它,可以使用工具,指定/i命令开关将一个程序集安装到GAC中,同样可以使用/u命令开关将一个程序集从GAC中卸载。注意:安装的程序集必须是强命名程序集:

GACUTIL /i //可用的绝对路径,Wince平台直接在命令窗口中用CGACUTIL(Compact)

4.用下面的命令为COM注册刚才的程序集,生成COM库文件(程序集注册工具读取程序集中的元数据,并将所需的项添加到注册表中,注册表允许 COM 客户程序以透明方式创建 .NET Framework 类。类一经注册,任何 COM 客户程序都可以使用它,就好像该类是一个 COM 类。类仅在安装程序集时注册一次。程序集中的类实例直到被实际注册时,才能从

COM 中创建)

//下面命令注册 中包含的所有公共类,并生成和注册类型库

,该类型库包含 中定义的所有公共类型的定义

REGASM /tlb:

//或者可以选中:解决方案->Properties(右键)->Build->【Register for COM interop】(Wince平台的DLL此选项不可选)

5.创建非托管的VC++调用程序(此处用Win32 Console Project为例):

#include "stdafx.h"

#import "" named_guids raw_interfaces_only

using namespace SmartDeviceDLL;

int _tmain(int argc, _TCHAR* argv[])

{

printf("11n");

//初始化COM以及产生智能指针

HRESULT hr=CoInitializeEx(NULL,COINIT_MULTITHREADED);

if(hr!=S_OK)

printf("hr failedn");

else

printf("hr okn");

printf("222222222222222222n");

SmartDeviceDLL::ICalculatorPtr pICalc;

printf("2.1n");

HRESULT hRes=Instance(__uuidof(Class1),NULL,CLSCTX_ALL);

//HRESULT hRes=Instance(SmartDeviceDLL::CLSID_Class1);

printf("2.2n");

if(hRes==S_OK)

{

printf("hRes okn");

long lResult =0;

pICalc->Add(5,10, &lResult);

wprintf(L"the result is %dn",lResult);

}

else

printf("hRes failuren");

printf("333333333333n");

CoUninitialize();

printf("4444444444444444444n");

char c;

scanf("%c",&c);

return 0;

}

本文来自CSDN博客,转载请标明/suoxd123/archive/2010/01/08/

出处: