| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2311 人关注过本帖
标题:有人使用ShellExecuteEx函数吗
只看楼主 加入收藏
大树临风
Rank: 2
等 级:论坛游民
帖 子:132
专家分:14
注 册:2015-12-9
结帖率:75.68%
收藏
已结贴  问题点数:8 回复次数:7 
有人使用ShellExecuteEx函数吗
哪位高手使用过ShellExecuteEx函数,我想调用这个函数来打开一个PDF文件,同时进行指定文本的搜索,我知道这个函数好像可以实现这个功能,但是不知道怎么使用。
搜索更多相关主题的帖子: 函数 同时 指定 文本 搜索 
2019-05-28 18:51
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:4 
ShellExecute(hWnd: HWND; {指定父窗口句柄}
Operation: PChar; {指定动作, 譬如: open、runas、print、edit、explore、find[2]}
FileName: PChar; {指定要打开的文件或程序}
Parameters: PChar; {给要打开的程序指定参数; 如果打开的是文件这里应该是 nil}
Directory: PChar; {缺省目录}
ShowCmd: Integer {打开选项}
): HINST;
ShowCmd 参数可选值:SW_HIDE = 0; {隐藏}
SW_SHOWNORMAL = 1; {用最近的大小和位置显示, 激活}
SW_NORMAL = 1; {同 SW_SHOWNORMAL}
SW_SHOWMINIMIZED = 2; {最小化, 激活}
SW_SHOWMAXIMIZED = 3; {最大化, 激活}
SW_MAXIMIZE = 3; {同 SW_SHOWMAXIMIZED}
SW_SHOWNOACTIVATE = 4; {用最近的大小和位置显示, 不激活}
SW_SHOW = 5; {同 SW_SHOWNORMAL}
SW_MINIMIZE = 6; {最小化, 不激活}
SW_SHOWMINNOACTIVE = 7; {同 SW_MINIMIZE}
SW_SHOWNA = 8; {同 SW_SHOWNOACTIVATE}
SW_RESTORE = 9; {同 SW_SHOWNORMAL}
SW_SHOWDEFAULT = 10; {同 SW_SHOWNORMAL}
SW_MAX = 10; {同 SW_SHOWNORMAL}

坚守VFP最后的阵地
2019-05-28 19:56
大树临风
Rank: 2
等 级:论坛游民
帖 子:132
专家分:14
注 册:2015-12-9
收藏
得分:0 
回复 2楼 sdta
find[2]是怎么用的?直接写"find[2]"  吗?
2019-05-28 20:16
大树临风
Rank: 2
等 级:论坛游民
帖 子:132
专家分:14
注 册:2015-12-9
收藏
得分:0 
回复 2楼 sdta
请问如我想搜索"报告"两个字,怎么处理
2019-05-28 20:19
大树临风
Rank: 2
等 级:论坛游民
帖 子:132
专家分:14
注 册:2015-12-9
收藏
得分:0 
回复 2楼 sdta
原来是百度上的注解,但是还是不明白能不能用,我用find代替open,不行啊
2019-05-28 20:37
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10608
专家分:43186
注 册:2014-5-20
收藏
得分:4 
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



2019-05-28 21:40
大树临风
Rank: 2
等 级:论坛游民
帖 子:132
专家分:14
注 册:2015-12-9
收藏
得分:0 
回复 6楼 吹水佬
多谢版主,我试了一下,出现如下提示“cannot fine entry point ShellExecuteEx in the DLL”

不明白是怎么情况,是DLL有问题吗?
2019-05-29 10:00
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10608
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用大树临风在2019-5-29 10:00:54的发言:

多谢版主,我试了一下,出现如下提示“cannot fine entry point ShellExecuteEx in the DLL”

不明白是怎么情况,是DLL有问题吗?

贴代码来看看
2019-05-29 14:20
快速回复:有人使用ShellExecuteEx函数吗
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030987 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved