今年前段时间,我原来的一个同事突然打电话给我。起因是客户不让开发商在服务器上安装任何的应用程序,只允许部署网站。但是,这个应用系统的部份功能又用到了第三方的组件。组件肯定是要进行安装的,当然这样说也存在不对的地方,比如我可引用这个组件就像引用一个私有程序集的引用一样,而再专门做一个适配器来做一个中转,这样肯定也能解决问题。我想在我前段的论述中可能已经存一定的批漏了,首先我假设了客户知道组件的内部实现这些行为了,而这一点就与COM要求的隐藏性相违背了。就算后一种方法能够实现,这时我们就把组件退化成一个DLL也行,这样的“退化”如在项目之初到也是可以的。但到了进行交互之时要做这些的改动,肯定会对这个系统产生诸如项目DELAY,系统的改动大也会相应地引起系统的不稳定,开发人员的重新投入,测试的重新进行。在后期进行这项工作对一个开发商来说无疑是一个噩梦。或许有人会说这个客户也太不讲理了,但是开发商也有一定的疏忽之责,如果在开发之初便已了解到这个约束那么在开发之初就可以确定许多很好的方案来解决这个问题。这时是该“糊弄”客户的时候了,其实这种安装组件并不会对客户造成影响,当然本人是说这个组件要是可信懒的,如果真的重新来修改应用系统的话,可能造成系统不稳定及客户错过恰当的应用时机,这样会对客户造成一定的损失。这是对客户的一种“伤害”。就象我们很多人怕了吃苦药,小孩子就更是了,有的小孩吃到苦药就全部吐出来,这时药厂就在这个苦药上包上一层的糖衣。这种“欺骗”就是善意了。于是上面的问题就可以用后台启动注册进程来完成这项伟大的工作。
WINDOWS创建进程的方法有多种,我更喜欢VC编程,我这里就列举几种VC的进程创建方法。
>>WinExec 这种创建进程的方法是沿用原来win16系统下使用的方法。
>>ShellExecute win32 api
>>ShellExecuteEx win32 api
>>CreateProcess win32 api
>>使用组件的进程激活方法
在下面的例子中我只用上面的四种方法,组件的激活方法在这里就不叙述了。
1
// CreateProcess.cpp : Defines the entry point for the console application.
2
//
3
4
#include "stdafx.h"
5
#include "windows.h"
6
#include "shellapi.h"
7
8
//#pragma comment(lib,"shell32.lib") 如果在链接项中没有设置,就在这里加上这个链接。
9
/*******************************************************************************
10
// printf the help message
11
//
12
******************************************************************************/
13
14
void Help()
15
{
16
printf("Here are there some create process method!\n");
17
printf("1:Use winexec.\n");
18
printf("2:Use ShellExecute.\n");
19
printf("3:Use ShellExecuteEx.\n");
20
printf("4:Use CreateProcess.\n");
21
printf("Q:Quit the application.\n");
22
}
23
int main(int argc, char* argv[])
24
{
25
bool bQuit=false;
26
UINT uCode=0;
27
SHELLEXECUTEINFO Info;
28
STARTUPINFO startInfo;
29
PROCESS_INFORMATION pInfo;
30
while(!bQuit)
31
{
32
Help();
33
char ch=getchar();
34
getchar();
35
switch(ch)
36
{
37
case '1':
38
uCode=WinExec("notepad.exe",SW_SHOW);
39
break;
40
case '2':
41
uCode=(UINT)ShellExecute(NULL,"open","notepad.exe",NULL,NULL,SW_SHOW);
42
break;
43
case '3':
44
{
45
memset(&Info,0,sizeof(Info));
46
Info.cbSize=sizeof(Info);
47
Info.lpVerb="open";
48
Info.lpFile="notepad.exe";
49
Info.lpParameters=NULL;
50
Info.fMask=SEE_MASK_NOCLOSEPROCESS;
51
Info.nShow=SW_SHOWDEFAULT;
52
ShellExecuteEx(&Info);
53
}
54
break;
55
case '4':
56
{
57
memset(&startInfo,0,sizeof(startInfo));
58
startInfo.cb=sizeof(startInfo);
59
CreateProcess(NULL,"notepad.exe",NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&startInfo,&pInfo);
60
}
61
break;
62
case 'Q':
63
bQuit=true;
64
break;
65
default:
66
break;
67
}
68
}
69
return 0;
70
}
上面的示例代码就这么少,当然使用起来不会象文章中这样简单,但是关键的也就是这些了。对创建进程就是这么简单。
我很喜欢玩两个人比武的游戏,在其中我取得了很多的乐趣,给开游戏厅的老板尽了身为热血少年的一份心,也为国家多一份税收。我玩的角色武功套路也就只有这么几招,招式是简单了些,但很有用,不是吗?我经常两个铜牌就可以玩上一两个时时辰。