ShellExecuteEx的原形:BOOL ShellExecuteEx(_Inout_ SHELLEXECUTEINFO *pExecInfo)。
就一个“输入/输出”参数pExecInfo,这个pExecInfo是一个指向SHELLEXECUTEINFO结构类型数据的指针(也可以理解为存放一个SHELLEXECUTEINFO结构类型数据的地址)。
SHELLEXECUTEINFO 结构:
SHELLEXECUTEINFO STRUCT
cbSize DWORD ?
fMask DWORD ?
hwnd DWORD ?
lpVerb DWORD ?
lpFile DWORD ?
lpParameters DWORD ?
lpDirectory DWORD ?
nShow DWORD ?
hInstApp DWORD ?
lpIDList DWORD ?
lpClass DWORD ?
hkeyClass DWORD ?
dwHotKey DWORD ?
union
hIcon DWORD ?
hMonitor DWORD ?
ends
hProcess DWORD ?
SHELLEXECUTEINFO ENDS
从结构成员看,有几个数据要与“指针”打交道。
VFP调用ShellExecuteEx难点在“指针”问题,VFP没有指针的概念,所以要调用API来分配内存空间并写入数据。
示例:调用ShellExecuteEx打开记事本并3秒后自动关闭。
DECLARE LONG GetProcessHeap IN Kernel32
DECLARE LONG HeapAlloc IN Kernel32 LONG, LONG, LONG
DECLARE LONG HeapFree IN Kernel32 LONG, LONG, LONG
DECLARE LONG TerminateProcess IN Kernel32 LONG, LONG
DECLARE LONG ShellExecuteEx IN Shell32 STRING@
szFile = "C:\windows\system32\notepad.exe" + 0h00
dhFile = HeapAlloc(GetProcessHeap(), 8, LEN(szFile))
SYS(2600, dhFile, LEN(szFile), szFile)
stSEI = BINTOC(60,"4RS");
+ BINTOC(0x40,"4RS") + REPLICATE(0h00,8);
+ BINTOC(dhFile,"4RS") + REPLICATE(0h00,8);
+ BINTOC(1,"4RS") + REPLICATE(0h00,28)
ShellExecuteEx(@stSEI)
HeapFree(GetProcessHeap(), 8, dhFile)
** 3秒后关闭
dhProcess = CTOBIN(RIGHT(stSEI, 4), "4RS")
INKEY(3)
TerminateProcess(dhProcess, 0)
CLEAR DLLS
RETURN