Visual C++程序的相互调用 向黑客迈进!!!

本文详细介绍如何使用Visual C++通过ShellExecute()函数实现程序间的相互调用,并演示了参数传递的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Visual C++程序的相互调用 向黑客迈进!!
最近有同学问我怎样用VC++进行程序的相互调用,难倒了我。因为我的VC++的程序调用也不会。怎么办?没法回答别人的问题,只好自己摸索了。我在今天利用上网和查阅MSDN终于解决了这个问题。为了不让其它的同学再走弯路,我就将自己的解决方法告诉大家,希望对大家有所用处。
大家肯定下载过很多的程序,也看过程序之间有这相互调用的现象。这并不奇怪,因为作为程序的相互调用,这是必须要做到的。大家试一下:打开一个图像文件,使用“Windows 图片和传真查看器”打开,我们能看到缩放的图片。如果我们点击“?”旁边的画图按钮,我们就会关闭Windows 图片和传真查看器,并且使用画图程序打开。这就是一种典型的程序之间调用现象。这是怎样实现的呢?如果要说实现的机制,那自然不是我的能力范围,因为这涉及到windows内核编程。但是windows的API给我们提供了一个接口,这样我们就可以进行函数的调用了。这里起到关键作用的一个函数就是ShellExecute()函数了。
关键词:ShellExecute()
让我们先看看这个函数吧。
从字面上我们很容易看出,这是一个windows外壳执行程序的函数。利用我们windows这个外壳,我们可以很容易地进行程序的调用。它的定义是这样的。

Code:
  1. HINSTANCEShellExecute(
  2. HWNDhwnd,//这是调用程序窗口的句柄,如果是NULL,那么被调用程序将于程序窗口无任何关系。
  3. LPCTSTRlpOperation,//打开的方式,通常有edit、explorer、find、open、print、NULL这几种。如果是NULL,那么将默认以“open”打开。
  4. LPCTSTRlpFile,//文件或程序的字符串指针
  5. LPCTSTRlpParameters,//附加参数的字符串指针
  6. LPCTSTRlpDirectory,//指定默认程序路径的字符串指针
  7. INTnShowCmd//显示窗口的方式
  8. );

这里说明一下,这个函数不仅能够打开程序,还能打开一些基本的文档。甚至是网页或电子邮件。在百度百科上有详尽的解释。传送门在这里。

这里我并不想展开这个函数更多的用途。我们使用的这个函数是用来打开程序的不是吗。
好了,在这里幸亏有这个参数lpParameters,这样我们才能将我们所要打开程序的参数传进去。但是这并不是全部工作。大家知道是为什么吗?因为我们打开的程序是Win32应用程序,不是控制台程序了。这样的话,我们就不能使用main()函数了,只能以WinMain()函数为程序的入口函数了。
那么实参传的数值又是怎样被传到形参中去的呢?我查了网上很多的资料。网友们说了使用ParseCommandLine这个API函数,但是这往往不是最好的选择。不过还好有一个网友说了使用__argv[0]、__argv[1]...,我抱着试一试的心态写了一个这样的程序,试了下,果真好用!下面我就讲解一个例子,介绍以上函数和这些参数是怎么使用的。

温馨提醒:如果出现诸如“error C2664: “MessageBoxW”: 不能将参数 2 从“char [255]”转换为“LPCWSTR””之类的错误(通常是vs系列),请点击菜单->项目-><项目名称> 属性(P),再在弹出的对话框中左边的树状图中选择配置属性->常规,然后在右边的字符集中选择“使用多字节字符集”,这样做就是使类型转换能够顺利地进行,于是就不会报错了。

首先建立一个win32项目,名字就取“主程序模块”吧。添加cpp文件,并写下如下代码:

Code:
  1. #include<windows.h>
  2. intWINAPIWinMain(HINSTANCEhInst,HINSTANCEprevhInst,LPSTRcmd,intshow)
  3. {
  4. MessageBox(NULL,"打开“被调用程序一”","主程序消息",MB_OK);
  5. ShellExecute(NULL,"open","e://被调用程序一.exe","参数一参数二",NULL,SW_SHOWDEFAULT);
  6. return0;
  7. }

程序无误,直接生成解决方案(在VC6中直接组建项目)。然后再新建一个项目,命名为“被调用程序一”。添加cpp文件,并写下如下代码:

Code:
  1. #include<windows.h>
  2. #include<string.h>
  3. intWINAPIWinMain(HINSTANCEhInst,HINSTANCEprevhInst,LPSTRcmd,intshow)
  4. {
  5. charstr[50]="参数是:";
  6. inti;
  7. for(i=1;i<__argc;i++)strcat(str,__argv[i]);
  8. strcat(str,"/n继续调用“被调用程序二”");
  9. MessageBox(NULL,str,"被调用程序一消息",MB_OK);
  10. ShellExecute(NULL,"open","e://被调用程序二.exe",__argv[2],NULL,SW_SHOWNORMAL);
  11. return0;
  12. }

程序无误,直接生成解决方案(在VC6中直接组建项目)。然后再新建一个项目,命名为“被调用程序二”。添加cpp文件,并写下如下代码:

Code:
  1. #include<windows.h>
  2. #include<string.h>
  3. intWINAPIWinMain(HINSTANCEhInst,HINSTANCEprevhInst,LPSTRcmd,intshow)
  4. {
  5. charstr[40]="参数是:";
  6. inti;
  7. for(i=1;i<__argc;i++)strcat(str,__argv[i]);
  8. strcat(str,"/n调用结束");
  9. MessageBox(NULL,str,"被调用程序二消息",MB_OK);
  10. return0;
  11. }

最后,将项目中“/debug/被调用程序一.exe”和“/debug/被调用程序二.exe”都放到E盘中去,去执行最先生成的“主程序模块.exe”,我们就可以得到如下的结果。(如下图)

这说明,我们的程序成功地实施了调用,这里除了ShellExecute()函数以外,__argc、__argv[i]也很重要。因为这些变量已经被包含在stdlib.h中了,而stdlib.h被包含在windows.h中了,所以我们可以毫无顾虑地使用它了。
首先执行“主程序模块.exe”,它执行的时候再调用“被调用程序一.exe”,由于执行的异步操作,我们可以看到,打开“被调用程序一.exe”的时候,“主程序模块.exe”也就消失了。我给“被调用程序一.exe”传入了两个参数:“参数一”和“参数二”在“被调用程序一.exe”中也得到了完美的显示,同理,在“被调用程序二.exe”中也得到了很好的显示。这个例子很好理解,我就不解释了。如果大家还有什么疑问的话,可以回复我,我会耐心地回答的。

我更多“向黑客迈进!!!”的文章:


怎么样,程序中的相互调用就这么简单吧。想想“360安全卫士”,在调用“360杀毒”和“360软件管家”的时候,我们怎么没想到可以用这种方式实现呢!虽然我并不知道这些软件在程序模块的相互调用的时候是不是使用这样的方式...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值