Wednesday, May 13, 2009

form's syncretize

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Show;
form2.ManualDock(Form1.Panel1,nil,alNone) ;
end;

button2.click events:
form2.manualdock(nil,nil,alnone);

Sunday, May 10, 2009

Delphi中的集成VBS脚本语言应用

Delphi中的集成VBS脚本语言应用

罗焱 从薇 王正浩


摘 要:使用ActiveX Scripting技术,可以在应用程序中集成使用脚本语言。本文介绍如何应用这一技术在Delphi应用程序中添加VBScript支持。
关键词:ActiveX脚本描述;Delphi;VBScript

1.引言
  Delphi语言是Borland公司开发的一种功能强大的编程语言,它基于串口和面向对象,并兼有VC的强大功能和VB的快速开发、易学易用的优点,具有开发效率高、界面制作美观方便、可实现各种操作功能等特点。VBS全称Visual Basic Script,是一种简单易学,功能强大的脚本语言,应用极为广泛。
本文介绍了通过ActiveX Scripting技术在Delphi中调用和操作VBS的方法,实现了Delphi和VBS的混合编程,充分发挥了两者各自的优势。

2.基本原理
2.1 ActiveX技术的基本概念
在Delphi中无法直接调用VBS,而利用ActiveX技术可以解决这个问题。ActiveX是Microsoft公司于1996年提出的一项技术,它以COM(Component Object Model,组件对象模型)为基础,使得不同的进程(特别是网络进程)之间可以相互通信。ActiveX控件是Microsoft公司提供的一种用于模块集成的协议,是可移植的软件模块,适用于各种开发语言,因而与开发平台无关。ActiveX控件由一些遵循ActiveX规范的可执行代码组成,比如一个.exe,.dll或.ocx文件。在程序中加入ActiveX控件后,它将成为开发和运行环境的一部分,并为应用程序提供新的功能。ActiveX控件保留了一些普通Delphi控件的属性、事件和方法,其特有的方法和属性大大地增强了程序设计者的能力和灵活性。
2.2 ActiveX脚本描述(ActiveX Scripting)
使用ActiveX技术中的ActiveX脚本描述(ActiveX Scripting)技术,可以从客户端或者服务器端操纵ActiveX控制和Java程序,传递数据,协调它们之间的操作。
ActiveX Scripting体系由一个COM接口族组成,这些接口定义了一个把脚本引擎和宿主程序连接起来的协议。在ActiveX Scripting的世界里,脚本引擎只是一个组件对象,它能够动态地执行脚本程序。宿主应用程序可以将它的Automation接口暴露在脚本引擎的名字空间中,可在动态执行的脚本中像访问程序中的变量那样访问应用程序的对象。
应用程序根据要解析的Script语言来创建和初始化脚本引擎,然后把应用程序连接在引擎上。然后把脚本代码提交给脚本引擎,脚本代码就可以执行了。
  ActiveX Scripting利用WSH,即Windows Scripting Host来做为脚本语言的工作环境。WSH是在系统内植入的一个基于32位Windows平台、并独立于语言的脚本运行环境,WSH架构于ActiveX之上,通过充当ActiveX的脚本引擎控制器为Windows用户充分利用威力强大的脚本指令语言扫清了障碍。

3.调用VBS在Delphi中的实现
  要在Delphi中调用VBS首先需要在DELPHI集成环境中安装ActiveX控件。
  要导入Activex控件,先选中Delphi菜单中的Component,选择导入ActiveX控制,安装Microsoft Script Control,就在Delphi环境中安装了ActiveX控件,然后在程序代码中加上这样一句:use MSScriptControl_TLB就可以调用VBS代码了。
  代码其余部分参见下列代码示范:
 l_ScriptControl:=TScriptControl.Create(nil); //创建Script控制对象
l_ScriptControl.AllowUI:=True;
l_ScriptControl.Language:='VBScript'; //确定Script语言
v := VarArrayCreate([0, 0], varVariant);
v[0] := InputVarArrays;
Params: = PSafeArray(TVarData(v).VArray);
l_scriptCode:=Tstringlist.Create;
try
l_scriptCode.LoadFromFile(VBScript_filename+'.vbs'); //导入VBS文件程序
if l_scriptCode.Count=0 then exit;
l_ScriptControl.AddCode(l_scriptCode.Text);
result:=l_ScriptControl.Run(VBScript_filename, Params); //运行VBS程序
finally
l_ScriptControl.Free; //最后释放所有的VBS对象
l_scriptCode.Free;
end;
  这样就可以成功的调用一个VBS程序进行所需的操作了。但这只是做了最基本的操作,离实际的需求还有一段距离。比如说如果希望为了提高代码重用性和效率,可以使用事先写好的一些公用VBS函数,如一些基本数学函数。但是上面的例子只能调用一个VBS文件,文件名即函数名,有极大的局限性。
为了解决上面的问题,有相应的解决办法。如下面的程序所示:
……//循环检查要装入的VBS文件是否存在
l_scriptCode:=Tstringlist.Create;
l_ScriptControl:=TScriptControl.Create(nil);
try
l_ScriptControl.AllowUI:=True;
l_ScriptControl.Language:=L_VBScript;
v := VarArrayCreate([0,0], varVariant);
v[0] := InputVarArrays;
Params: = PSafeArray (TVarData(v).VArray);
//循环装入需要的VBS文件,并检查文件代码是否为空
for l_i := 0 to VBScript_filenames.Count-1 do
begin
l_scriptCode.LoadFromFile(VBScript_filenames.Strings[l_i] +’.vbs’);
if l_scriptCode.Count=0 then exit;
l_ScriptControl.AddCode(l_scriptCode.Text);
end;
//正常调用VBS程序
 OutputDataSets :=l_ScriptControl.Run(VBScript_filenames.Strings[0],Params);
finally
l_ScriptControl.Free;
l_scriptCode.Free;
end;
  来比较一下两段程序的不同,首先是第二个程序可以载入多个文件,其中第一个文件与要执行的主函数同名,其余的文件包含了该主函数可能会调用的一些基本函数,为此还增加了检查函数文件及其代码的工作。
  这样就可以很轻松的使用事先写好的一些程序,象搭积木一样,让用户不必学习深奥的编程知识,有熟练的编程技巧,就可以轻松使用VBS进行自己想要的操作。同时遇到以后功能扩展的需要,也可以编写符合要求的VBS函数进行我们需要的操作了。
4.总结
随着计算机和信息技术的不断发展,计算机的软件应用变得越来越普遍,但是要设计适应要求的通用型软件还是有很大的难度。本文介绍了利用Active Scripting技术在Delphi中集成使用VBS的方法,目的就是为了利用脚本语言为应用程序提供二次编程的能力,从而大大的提高软件的适用性。Delphi和VBScript都是非常强大的开发工具,如果能够很好地把它们结合起来,相信能够开发出越来越多功能强大、适用性强的商业软件。

参考文献:
[1] 吕思伟,潘爱民.ActiveX Scriptng技术(一)一(三).微电脑世界 1999-01~03
[2] Steve Teixeora,Xavier Pacheco著 任旭钧,王永生,冯译波等译 Delphi5开发人员指南 机械工业出版社 2000年7月第一版
[3] .Introduction to ActiveX Controls,Microsoft Corp.,MSDN,1998年8月
[4]. http://www.microsoft.com/,Microsoft公司,包括MSDN、MSJ等技术资源

Wednesday, May 06, 2009

splash form

procedure TForm1.FormCreate(Sender: TObject);
begin
with tform2.create(self) do
try
show;
update;
sleep(10000);
finally
Free;
end;
end;
form2 has been setted available

Saturday, May 02, 2009

use other unit

unit2.
unit Unit2;

interface
uses Dialogs, StrUtils;
procedure sayhelloto(yourname:string);
implementation
procedure sayhelloto(yourname:string);
var hello:string;
begin
hello:=yourname+',hello!';
ShowMessage(hello);
end;
end.
unit1.
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,StrUtils;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
uses Unit2;
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Caption:=ReverseString(Edit1.Text);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Unit2.sayhelloto('liqing');
end;

end.

Thursday, April 30, 2009

sth that operate webbrowser

WebBrowser 操作记要
WebBrowser1.GoHome; //到浏览器默认主页
WebBrowser1.Refresh; //刷新
WebBrowser1.GoBack; //后退
WebBrowser1.GoForward; //前进
WebBrowser1.Navigate('...'); //打开指定页面
WebBrowser1.Navigate('about:blank'); //打开空页面
--------------------------------------------------------------------------------
//打开空页面, 并写入...

WebBrowser1.Navigate('about:<头><标题>标题><身体>页面内容');
--------------------------------------------------------------------------------
//读取网页脚本中的变量:

procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
i: Integer;
begin
s := WebBrowser1.OleObject.document.Script.str;
i := WebBrowser1.OleObject.document.Script.num;
ShowMessage(s); //Hello
ShowMessage(IntToStr(i)); //99

//也可以这样读:
s := WebBrowser1.OleObject.document.parentWindow.str;
i := WebBrowser1.OleObject.document.parentWindow.num;
ShowMessage(s); //Hello
ShowMessage(IntToStr(i)); //99
end;
假如网页中有这样的语句:


--------------------------------------------------------------------------------

//调用网页脚本中的函数:

procedure TForm1.Button1Click(Sender: TObject);
begin
WebBrowser1.OleObject.document.parentWindow.MB(); //HTML-Js

//如需指定脚本语言, 需要:
WebBrowser1.OleObject.document.parentWindow.execScript('MB()','JavaScript'); //HTML-Js
end;
假如有这样的脚本:


--------------------------------------------------------------------------------

//判断网页及内部框架网页是否全部下载完毕

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
begin
if WebBrowser1.Application = pDisp then
begin
Text := '网页下载完毕!';
end;
end;

--------------------------------------------------------------------------------

//改变背景色或背景图片:
WebBrowser1.OleObject.document.body.bgcolor := '#FF0000';
WebBrowser1.OleObject.document.body.background := '...图片地址';
--------------------------------------------------------------------------------
//操作有 ID 标签的对象:
var
s: string;
begin
s := WebBrowser1.OleObject.document.getElementByID('span1').innerText;
ShowMessage(s); //这是 span1 标签中的内容

//或者:
s := WebBrowser1.OleObject.document.parentWindow.span1.innerText;
ShowMessage(s); //这是 span1 标签中的内容

//隐藏它:
WebBrowser1.OleObject.document.parentWindow.span1.style.display := 'none';
end;
假如网页中有这样的内容:
这是 span1 标签中的内容


--------------------------------------------------------------------------------

//获取网页源代码
var
s: string;
begin
s := WebBrowser1.OleObject.document.body.innerHTML; //body内的所有代码
s := WebBrowser1.OleObject.document.body.outerHTML; //body内的所有代码, 包含body标签
s := WebBrowser1.OleObject.document.documentElement.innerHTML; //html内的所有代码
end;

//获取网页全部源代码
uses ActiveX;
var
ms: TMemoryStream;
begin
if not Assigned(WebBrowser1.Document) then Exit;
ms := TMemoryStream.Create;
(WebBrowser1.Document as IPersistStreamInit).Save(TStreamAdapter.Create(ms), True);
ms.Position := 0;
Memo1.Lines.LoadFromStream(ms, TEncoding.UTF8);
// Memo1.Lines.LoadFromStream(ms, TEncoding.Default); {GB2312 等双字节}
ms.Free;
end;
--------------------------------------------------------------------------------
//WebBrowser 中的右键菜单

//先要添加ApplicationEvents1,指定其Message事件

//屏蔽右键菜单
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
with Msg do
begin
if not IsChild(WebBrowser1.Handle, hWnd) then Exit;
Handled := (message = WM_RBUTTONDOWN) or (message = WM_RBUTTONUP) or (message = WM_CONTEXTMENU);
end;
end;

//替换右键菜单
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
var mPoint: TPoint;
begin
if IsChild(WebBrowser1.Handle, Msg.Hwnd) and
((Msg.Message = WM_RBUTTONDOWN) or (Msg.Message = WM_RBUTTONUP)) then
begin
GetCursorPos(mPoint); //得到光标位置
PopupMenu1.Popup(mPoint.X, mPoint.Y); //弹出popupmenu1的菜单
Handled:=True;
end;
end;
--------------------------------------------------------------------------------
//新页面写入
begin
WebBrowser1.Navigate('about:blank');
WebBrowser1.OleObject.Document.Writeln('ok');
end;

//从流中写入:
var
ms: TMemoryStream;
begin
ms := TMemoryStream.Create;
Memo1.Lines.SaveToStream(ms);
ms.Position := 0;
(WebBrowser1.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms));
ms.Free;
end;

//禁止提示脚步错误
procedure TForm1.WebBrowser1NavigateComplete2(ASender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
begin
WebBrowser1.Silent := True;
end;

//禁止弹出窗口
procedure TForm1.WebBrowser1NewWindow2(ASender: TObject; var ppDisp: IDispatch;
var Cancel: WordBool);
begin
Cancel := True;
end;

Tuesday, April 28, 2009

Autohidden form which effect like qq

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ComCtrls, StdCtrls; //第1步,加ExtCtrls, ComCtrls, StdCtrls;

type
TForm1 = class(TForm)
Timer1: TTimer;
Timer2: TTimer;

procedure Timer1Timer(Sender: TObject);
procedure Timer2Timer(Sender: TObject);

private
{ Private declarations }
//第2步 自定义函数GetFormNameAt, 它可获得当前鼠标指针下面的窗体的名称
function GetFormNameAt(const Pos: TPoint): string;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
//*****************************************************************************
//以下是第3步程序代码
function Tform1.GetFormNameAt(const Pos: TPoint): string;
var
w: TWinControl;
begin
//得到鼠标指针下的VCL可视组件
w:= FindVclWindow(Pos);
if (w <> nil) then
begin
//当W的上级Parent不为空时就继续往上找
while w.Parent <> nil do
w:= w.Parent;
//最后返回窗体的名称Name
Result:= w.Name;
end
else
Result:= '';
end;
//******************************************************************************
procedure TForm1.Timer1Timer(Sender: TObject);
var
winPos: TPoint;
t: integer;
b: boolean;
begin
b:= false;
if (form1.Top <= 3) then
begin
b:= true;
t:= 0;
end
else if form1.Left + form1.Width - Screen.Width >= 0 then
begin
b:= true;
t:= form1.Top;
end
else
t:= form1.Top;
if b then
begin
//得到当前鼠标指针的在屏幕上的坐标
GetCursorPos(winPos);
//当鼠标指针下的窗体的Name等于form1.name时
if form1.Name = GetFormNameAt(winPos) then
{在此我们可以为form1取一个特别的名称,以防有别的窗体名称与它相同}
begin
//停用Timer2
form1.timer2.Enabled:= false;
//form1的Top与屏幕对齐
form1.Top:= t;
if t <> 0 then
form1.Left:= Screen.Width - form1.Width;
end
else begin
form1.Timer2.Enabled:= true;
end;
end;
end;
//******************************************************************************
procedure TForm1.Timer2Timer(Sender: TObject);
// 当 top 距屏幕上侧 20 像素时,自动隐藏
begin
if form1.Top <= 20 then
begin
//将form1向上移,在屏幕上方露出3像素
form1.Top:= -(form1.Height - 3);
if (form1.Left + form1.Width > Screen.Width) then
form1.Left:= Screen.Width - form1.Width;
end
// 当 left 距屏幕下侧 20 像素时,自动隐藏
else if form1.Left + form1.Width - Screen.Width >= -20 then
//将form1向右移,在屏幕右方露出4像素
form1.Left:= Screen.Width - 4;
end;
end.

Delphi中ShellExecute的妙用

功能是运行一个外部程序(或者是打开一个已注册的文件、打开一个目录、打印一个文件等等),并对外部程序有一定的控制。

  有几个API函数都可以实现这些功能,但是在大多数情况下ShellExecute是更多的被使用的,同时它并不是太复杂。下面举例说明它的用法。

开始一个新的应用程序
   ShellExecute(Handle, 'open', PChar('c:\test\app.exe'), nil, nil, SW_SHOW);

打开记事本,并打开一个文件(系统能识别记事本应用程序的路径,因此我们不必使用绝对路径)
   ShellExecute(Handle, 'open', PChar('notepad'), PChar('c:\test\readme.txt'), nil, SW_SHOW);

打印一个文档
   ShellExecute(Handle, 'print', PChar('c:\test\test.doc'), nil, nil, SW_SHOW);

   注意:可能你会看到word暂时的被打开,但它会自动关闭。

打开一个HTML页面
   ShellExecute(Handle, 'open', PChar('http://www.festra.com/'), nil, nil, SW_SHOW);

你能通过一个已经注册的文件类型来打开应用程序
   ShellExecute(Handle, 'open', PChar('c:\test\readme.txt'), nil, nil, SW_SHOW);

用windows Explorer 打开一个目录
   ShellExecute(Handle, 'explore', PChar('c:\windows)', nil, nil, SW_SHOW);

运行一个DOS命令并立即返回
   ShellExecute(Handle, 'open', PChar('command.com'), PChar('/c copy file1.txt file2.txt'), nil, SW_SHOW);

运行一个DOS命令并保持DOS窗口存在
   ShellExecute(Handle, 'open', PChar('command.com'), PChar('/k dir'), nil, SW_SHOW);


ShellExecute详解

ShellExecute函数用于打开或者打印一个指定的文件。指定的文件必须是可执行文件或者文档文件。
HINSTANCE ShellExecute(
HWND hwnd, // handle to parent window
LPCTSTR lpOperation, // pointer to string that specifies operation to perform
LPCTSTR lpFile, // pointer to filename or folder name string
LPCTSTR lpParameters, // pointer to string that specifies executable-file parameters
LPCTSTR lpDirectory, // pointer to string that specifies default directory
INT nShowCmd // whether file is shown when opened
)

* Params(参数解释)
Hwnd
指定父窗口句柄。这个窗口接收工程产生的所有消息。例如:一个工程可以通过消息框报告错误。
lpOperation
以一个以null结束的字符串描述操作的执行。以下的操作字符串是有效的:

行号 参数 含义
1 “open” 函数打开由lpFile指定的文件。这个文件必须是可执行文件或者文档文件。文件夹必须是可打开的文件夹。
2 “print” 函数打印由lpFile指定的文件。这个文件应该是文档文件。如果指定的文件是可执行文件,函数将以open的方式打开这个文件。
3 “explore” 函数将搜索由lpFile指定的文件夹。

lpOperation参数如果为null,函数将以open的方式打开由lpFile指定的文件。
lpFile
以一个null结束的字符串描述打开或者打印指定的文件,或者打开或者搜索指定的
文件夹。函数可以打开一个指定的文件或者文件夹,也可以打印一个文档文件。
lpParameters
如果lpFile指定的是一个可执行文件,lpParameters以一个以null结束的字符串指定该执行文件传给应用软件的参数。
行号 参数 含义
1 SW_HIDE 隐藏这个窗体,并激活其他窗体。
2 SW_MAXIMIZE 最大化指定的窗体。
3 SW_MINIMIZE 最小化指定的窗体,并按顺序激活最上层的窗体。
4 SW_RESTORE 激活并显示窗体。如果窗体为最小化或者最大化,窗体恢复到原始大小和位置。应用程序当恢复一个最小化的窗体时将指定标记。
5 SW_SHOW 以当前的大小和位置激活并显示窗体。
6 SW_SHOWDEFAULT
7 SW_SHOWMAXIMIZED 激活并最大化显示窗体。
8 SW_SHOWMINIMIZED 激活并最小化现实窗体。
9 SW_SHOWMINNOACTIVE 最小化窗体,保持其激活状态。
10 SW_SHOWNA 以当前状态显示窗体,保持其激活状态。
11 SW_SHOWNOACTIVATE 以当前的大小和位置显示窗体,并保持其激活状态。
12 SW_SHOWNORMAL 激活并显示一个窗体。如果窗体为最大化或者最小化,窗体恢复到原始的大小和位置。当窗体第一次显示的时候,应用程序记录标记。
如果lpField指定的是一个文档文件,lpParameters应该为null。
lpDirectory
以一个以null结束的字符串指定文件开始运行的默认目录。
nShowCmd
如果lpField指定了一个可执行文件,nShowCmd指定这个文件在被打开时如何显示。这个参数可以是以下值中的任何一个:

如果lpField指定的是文档文件,nShowCmd应该为0。

* return Values(返回值)
如果函数执行成功,返回值是已经运行的工程的实例句柄,或者动态数据交换服务器应用程序的句柄。
(具体返回值列表从略,请参考Delphi在线帮助)
* Remarks(注释)
被lpFile参数指定的文件必须是一个可执行文件或者文档文件。如果文件是一个文档文件,ShellExecute函数将根据lpOperation参数决定打开或者打印这个文件。如果是可执行文件,ShellExecute函数将打开它,即使lpOperation参数被指定为printing。
你可以使用ShellExecute打开活着搜索一个文件夹。可以使用以下任意一种方式打开一个文件夹:
ShellExecute(handle, NULL, path_to_folder, NULL, NULL, SW_SHOWNORMAL);
或者
ShellExecute(handle, "open", path_to_folder, NULL, NULL, SW_SHOWNORMAL);
使用下面的调用搜索文件夹:
ShellExecute(handle, "explore", path_to_folder, NULL, NULL, SW_SHOWNORMAL)
如果lpOperation参数为null,函数将打开由lpFile指定的文件。如果lpOperation参数为”open”或者”explore”,函数将强制打开窗体或者资源管理器。


注:在新窗口打开网页的办法
ShellExecute(self.Handle, PChar('open'), PChar('explorer'), PChar(URL), nil, SW_MAXIMIZE);
Q: 如何打开一个应用程序?
ShellExecute(this->m_hWnd,"open","calc.exe","","", SW_SHOW) ;

ShellExecute(this->m_hWnd,"open","notepad.exe",
"c:\MyLog.log","",SW_SHOW);
Q: 如何打开一个同系统程序相关连的文档?
ShellExecute(this->m_hWnd,"open",
"c:\abc.txt","","",SW_SHOW);
Q: 如何打开一个网页?
ShellExecute(this->m_hWnd,"open","http://www.google.com";,"","", SW_SHOW);
Q: 如何激活相关程序,发送EMAIL?
ShellExecute(this->m_hWnd,"open",
"mailto:nishinapp@yahoo.com","","", SW_SHOW);
Q: 如何用系统打印机打印文档?
ShellExecute(this->m_hWnd,"print",
"c:\abc.txt","","", SW_HIDE);
Q: 如何用系统查找功能来查找指定文件?
ShellExecute(m_hWnd,"find","d:\nish",
NULL,NULL,SW_SHOW);
Q: 如何启动一个程序,直到它运行结束?
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "c:\MyProgram.exe";
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
或:
PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo; //入口参数
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo ; //分配大小
if(CreateProcess("c:\winnt\notepad.exe", NULL,
NULL,NULL,FALSE,0,NULL,
NULL,&StartupInfo,&ProcessInfo))
{
WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
}
else
{
MessageBox("The process could not be started...");
}
Q: 如何显示文件或文件夹的属性?
SHELLEXECUTEINFO ShExecInfo ={0};
ShExecInfo.cbSize = sizeof
SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_INVOKEIDLIST ;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = "properties";
ShExecInfo.lpFile = "c:\"; //也可以是文件
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL