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

来源:互联网 发布:淘宝最大的零食店 编辑:程序博客网 时间:2024/05/01 23:04

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

Code:
  1. HINSTANCE ShellExecute(           
  2.     HWND hwnd,// 这是调用程序窗口的句柄,如果是NULL,那么被调用程序将于程序窗口无任何关系。   
  3.     LPCTSTR lpOperation,// 打开的方式,通常有edit、explorer、find、open、print、NULL这几种。如果是NULL,那么将默认以“open”打开。   
  4.     LPCTSTR lpFile,// 文件或程序的字符串指针   
  5.     LPCTSTR lpParameters,// 附加参数的字符串指针   
  6.     LPCTSTR lpDirectory,// 指定默认程序路径的字符串指针   
  7.     INT nShowCmd// 显示窗口的方式   
  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.   
  3. int WINAPI WinMain( HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmd, int show )   
  4. {   
  5.  MessageBox( NULL, "打开“被调用程序一”""主程序消息", MB_OK );   
  6.  ShellExecute( NULL, "open""e://被调用程序一.exe""参数一 参数二", NULL, SW_SHOWDEFAULT );   
  7.  return 0;   
  8. }  

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

Code:
  1. #include <windows.h>   
  2. #include <string.h>   
  3.   
  4. int WINAPI WinMain( HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmd, int show )   
  5. {   
  6.  char str[50] = "参数是:";   
  7.  int i;   
  8.  for ( i = 1; i < __argc; i++ ) strcat( str, __argv[i] );   
  9.  strcat( str, "/n继续调用“被调用程序二”" );   
  10.  MessageBox( NULL, str, "被调用程序一消息", MB_OK );   
  11.  ShellExecute( NULL, "open""e://被调用程序二.exe", __argv[2], NULL, SW_SHOWNORMAL );   
  12.  return 0;   
  13. }  

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

Code:
  1. #include <windows.h>   
  2. #include <string.h>   
  3.   
  4. int WINAPI WinMain( HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmd, int show )   
  5. {   
  6.  char str[40] = "参数是:";   
  7.  int i;   
  8.  for ( i = 1; i < __argc; i++ ) strcat( str, __argv[i] );   
  9.  strcat( str, "/n调用结束" );   
  10.  MessageBox( NULL, str, "被调用程序二消息", MB_OK );   
  11.  return 0;   
  12. }  

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

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

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

  •  C/C++控制台程序的调用(附我写的病毒) 向黑客迈进!!!
  •  c++获取当前路径 向黑客迈进!!!
  •  windows c++编程获取当前路径 向黑客迈进!!!
  •  获取系统盘符 向黑客迈进!!!


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

原创粉丝点击