找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
楼主: mdyblog

[更新376#2825]PECMD2012.1.80.13_Win32_64.多窗口多线程.裸机系统2.3.3.1+18M酷M...

   火... [复制链接]
 楼主| 发表于 2013-2-3 19:09:24 | 显示全部楼层
原帖由 hhh333 于 2013-2-3 15:38 发表
看两者的说明是不一样的:
1、PECMD4.0:WAIT 0可检测用户的按键'A'~'Z'或'0'~'9',省略变量名时按键结果保存在环境变量%PressKey%中。
2、PECMD2012:WAIT 0/-N可检测用户的按键。'A'~'Z'或'0'~'9',直接返 ...


PECMD2012 的  WAIT 兼容 PECMD4.0 的 WAIT。 只是增强了功能。

比如:
WAIT 0,PKEY
MESS  [%PKEY%] @#OK

都是等待
用户按键。 按键'A'~'Z'或'0'~'9',返回对应的字母。这都是一样的。


PECMD2012  在此i持基础增强了。
按其它键时, PECMD4.0 无法区别。
                   PECMD2012  返回0xNN 的键码。


PECMD2012  还提供了 WAIT  -0 或 WAIT -cont   -0  来检测键盘,这个不阻塞,立即返回。

[ 本帖最后由 mdyblog 于 2013-2-3 19:13 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2013-2-3 20:04:16 | 显示全部楼层

调用内置的程序

PECMD2012.1.73.1-130202.多窗口线程孵化版_win32.sfx.zip

甲: 调用内置的程序
┃※执行内嵌程序。可以--exe:传递 或 命令首词传递。#数字 为直接在内存执行;*#数字 为放入自动删
┃  除的临时文件执行。数字为资源EXEDATA下的号码,可以CMPS压缩。很多程序必须用后者。
EXEC --exe:#100
EXEC --exe:*#100


1: 程序内置到MYPECMD.exe
以cmd.exe 为例。
1) CMPS 压缩
CMPS  cmd.exe cmd.CMZ

2) cmd.CMZ 加入 MYPECMD.EXE  的 资源 EXEDATA ,编号 100

2: 运行 内置的  cmd.CMZ
EXEC --exe:#100     cmd /c dir     //内存中运行
EXEC --exe:*#100    cmd /c dir     //自动生成一个临时文件,执行之;完毕自动删除。一定能删除,比WINRAR干净。


乙:EXEC --wd:**   
EXEC --wd:**    ... ...

--wd:** 指执行文件自身的目录。

这可以用来执行自解压文件。
WINRAR 制作自释放时:
    安静模式 = 全部隐藏
    不要 “解包到临时文件夹” !!!
    解压路径 为空。 (表示当前目录)。
自解压文件放入  MYPECMD.EXE  的 资源 EXEDATA ,编号 100

EXEC --wd:**  --exe:*#100     命令即参数
这样, 在一个PECMD自动删除的临时目录中,运行该自释放文件。 该程序退出后,PECMD将整个临时目录自动删除,包刮释放出来的文件。
  这个比WINRAR 的自删除 要可靠, 删除很干净。即使暂时文件还在 使用,还有文件在运行, PECMD还会删除它们。


丙: 生成唯一的临时文件或临时目录
┃TEMP [*del] *tmpdir   [,]变量名                //生成唯一的临时目录
┃TEMP [*del] *tmpfile  [,]变量名[,目录变量名]   //生成唯一的临时文件  
*del 为本程序(PECMD)退出时自动删除
TEMP *del *tmpfile  ,&&FName,&&Dir
MESS  [%&FName%] \n[%&DIR%]  @ #OK



  






[ 本帖最后由 mdyblog 于 2013-2-3 20:09 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2013-2-5 01:26:13 | 显示全部楼层

PING.WCS

原帖由 2011hwo1 于 2013-2-3 11:25 发表
pecmd 能调用系统ping函数吗? ping.exe大概要消耗100毫秒才能返回,而ping函数可以在几毫秒内返回.


PECMD 写的 PING 函数。
PING.WCS (包内有)
需要管理员运行。

支持广播地址
CALL PING  192.168.1.255

[ 本帖最后由 mdyblog 于 2013-2-5 11:38 编辑 ]
回复

使用道具 举报

发表于 2013-2-5 19:07:43 | 显示全部楼层
130202版使用 SHUT R
重启的时候导致找不到hal.dll
在三台不同的电脑上都是这样。

[ 本帖最后由 2012得了 于 2013-2-5 22:07 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2013-2-5 22:36:44 | 显示全部楼层
原帖由 2012得了 于 2013-2-5 19:07 发表
130202版使用 SHUT R
重启的时候导致找不到hal.dll
在三台不同的电脑上都是这样。

给个截图吧。

好像是文件系统出问题了吧,RAMDISK破坏了?

我在MBROS2.3.1 中测试,SHUT R 正常。

[ 本帖最后由 mdyblog 于 2013-2-5 23:37 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2013-2-5 22:43:08 | 显示全部楼层
原帖由 2011hwo1 于 2013-2-3 11:25 发表
pecmd 能调用系统ping函数吗? ping.exe大概要消耗100毫秒才能返回,而ping函数可以在几毫秒内返回.


IPHLPApi.DLL 的确有PING 函数, 不过不能接调用,需要组合。

PECMD2012.1.73.1-130205.多窗口线程孵化版_win32.sfx.zip 可以。
PING2.WCS (包内有)【普通用户也可用】:
ENVI &&&EnviMode=1
//常数
ENVI &&INVALID_HANDLE=0xFFFFFFFF  //-1 的ULONG 形式
//PING 主机 返回名
// 返回1:成功  0:失败
_SUB PING
        ENVI  %2=0
        ENVI#$ &&SendData = 0x31 0x32 0x33 0x34 0x35 0x36  //发送数据
        ENVI-addr  &&pSendData;&&lSendData=&SendData
        
        ENVI#$ &&ReplyBuffer= *1060 0x00    //接收缓存区
        ENVI-addr  &&pReplyBuffer;&&lReplyBuffer=&ReplyBuffer
        
        SOCK --gethostbyname# &&IP;%~1   //转换成整数IP
        
        ENVI &&hIcmpFile=
        CALL $**ret:&hIcmpFile  IPHLPApi.DLL,IcmpCreateFile
        FIND $X%&INVALID_HANDLE% = X%&hIcmpFile%, EXIT  //失败
        CALL $**ret:&&__ret  IPHLPApi.DLL,IcmpSendEcho,#%&hIcmpFile% ,#%&IP%,#%&pSendData% ,#%&lSendData%,#0 ,#%&pReplyBuffer% ,#%&lReplyBuffer% ,#1000
    CALL $**ret:&&ret3  IPHLPApi.DLL,IcmpCloseHandle,#%&hIcmpFile%
        ENVI  %2=%&__ret%
_END

FIND $1 = %&&__MAIN__%,  //END_IMPORT
FIND $X=X%1, CALL TEST! CALL PING %*
_SUB TEST
        ENVI &&RET=
        ENVI &&HOST=www.sina.com.cn   //127.0.0.1
        PING %&&HOST% &RET
        MESS  PING %&&HOST% = %&RET%
_END  


这个版本的CALL $配合 ENVI????? &,理论上可以使用任意函数。(不超过20(C调用为100)个参数,够了了吧)。



[ 本帖最后由 mdyblog 于 2013-2-6 09:13 编辑 ]
回复

使用道具 举报

发表于 2013-2-6 20:15:15 | 显示全部楼层
DATE [变量名] gmt
gmt 秒数是怎么计算出来的?
回复

使用道具 举报

 楼主| 发表于 2013-2-6 22:40:44 | 显示全部楼层
原帖由 2011hwo1 于 2013-2-6 20:15 发表
DATE [变量名] gmt
gmt 秒数是怎么计算出来的?


国际标准:
1970.1.1    0点开始计时的秒数。
回复

使用道具 举报

发表于 2013-2-7 10:35:04 | 显示全部楼层
原帖由 mdyblog 于 2013-2-5 22:43 发表


IPHLPApi.DLL 的确有PING 函数, 不过不能接调用,需要组合。

PECMD2012.1.73.1-130205.多窗口线程孵化版_win32.sfx.zip 可以。
PING2.WCS (包内有)【普通用户也可用】:
ENVI &&&EnviMode=1
//常数
...

====最新的孵化版与稳定版的测试报告--只贴上差异之处====
孵化版:
[EXEC !"X:\Program Files\winrar\REGDOC.CMD"] <0>:操作成功完成。
[EXEC !REGEDIT /S "X:\Program Files\UltraISO\ULTRAISO.REG"] <0>:操作成功完成。
DrvLoad安装驱动[X:\Windows\inf\netxe32.inf]<0>
。。。。。。
[DEVI X:\Windows\inf\net*.inf] <0>:操作成功完成。
[EXEC @!=netcfg.exe -winpe] <0>:操作成功完成。
[EXEC @!=netcfg.exe -c s -i MS_Server] <0>:操作成功完成。
[EXEC @!=netcfg.exe -c s -i ms_nativewifip] <0>:操作成功完成。
[EXEC @!=netcfg -e -c p -i MS_NDISUIO] <0>:操作成功完成。
[EXEC @!=netcfg.exe -e -c p -i MS_NDISWAN] <0>:操作成功完成。
[EXEC @!=netcfg.exe -e -c p -i MS_PPPOE] <0>:操作成功完成。
[SERV Spooler] <0>:操作成功完成。
[SERV Wlansvc] <0>:操作成功完成。

稳定版:
[EXEC !"X:\Program Files\winrar\REGDOC.CMD"] <2>:系统找不到指定的文件。
[EXEC !REGEDIT /S "X:\Program Files\UltraISO\ULTRAISO.REG"] <2>:系统找不到指定的文件。
。。。。。。
DrvLoad安装驱动[X:\Windows\inf\netxe32.inf]<0>
[DEVI X:\Windows\inf\net*.inf] <0>:操作成功完成。
[EXEC @!=netcfg.exe -winpe] <2>:系统找不到指定的文件。
[EXEC @!=netcfg.exe -c s -i MS_Server] <2>:系统找不到指定的文件。
[EXEC @!=netcfg.exe -c s -i ms_nativewifip] <2>:系统找不到指定的文件。
[EXEC @!=netcfg -e -c p -i MS_NDISUIO] <2>:系统找不到指定的文件。
[EXEC @!=netcfg.exe -e -c p -i MS_NDISWAN] <2>:系统找不到指定的文件。
[EXEC @!=netcfg.exe -e -c p -i MS_PPPOE] <2>:系统找不到指定的文件。
[SERV Spooler] <0>:操作成功完成。
[SERV Wlansvc] <1068>:依赖服务或组无法启动。
--------------------------
以下可否请楼主实现它,因为这些在4。0中都能正确执行:

[CALL $X:\Windows\System32\Macromed\Flash\Flash10k.ocx] <2147500034>:不支持此接口
[CALL $inetcomm.dll] <2147500034>:不支持此接口
[CALL $X:\Windows\SYSTEM32\sysmon.ocx] <2147500033>:尚未实现
说明:以上是4。0的代码,如果为代码的问题,请问2012的正确代码如何写?如果不是,请楼主实现,谢谢。

--------------------------
以下的正确意思:
[FILE E:\Pagefile.sys] <124>:系统调用级别不正确。
[TEAM FILE C:\Pagefile.sys|FILE D:\Pagefile.sys|FILE E:\Pagefile.sys] <1349>:令牌的类型对其尝试使用的方法不适当。
现在个人理解为“由于文件不存在,程序抛出的异常信息”,请问理解是否对?可否请楼主详细解说?

[ 本帖最后由 2012yws@ 于 2013-2-7 10:42 编辑 ]
回复

使用道具 举报

发表于 2013-2-7 17:21:34 | 显示全部楼层
FORX命令能不能支持cmd下dir命令所支持的/o的有命令选项,或者dir命令支持的所有选项,这样dir命令可以去掉了,而且速度比dir命令快.
回复

使用道具 举报

 楼主| 发表于 2013-2-7 18:12:47 | 显示全部楼层
原帖由 2012yws@ 于 2013-2-7 10:35 发表

====最新的孵化版与稳定版的测试报告--只贴上差异之处====
孵化版:
[EXEC !"X:\Program Files\winrar\REGDOC.CMD"] :操作成功完成。
[EXEC !REGEDIT /S "X:\Program Files\UltraISO\ULTRAISO.REG"] :操 ...


1: 稳定版已修正

2: 以下的正确意思:
[FILE E:\Pagefile.sys] <124>:系统调用级别不正确。
[TEAM FILE C:\Pagefile.sys|FILE D:\Pagefile.sys|FILE E:\Pagefile.sys] <1349>:令牌的类型对其尝试使用的方法不适当。
现在个人理解为“由于文件不存在,程序抛出的异常信息”,请问理解是否对?可否请楼主详细解说?

A:
由于文件不存在,程序 返回 函数的错误码。

FILE 调用的函数比较复杂, 返回值比较难懂。
FILE 错误码124:
文件路无效.

PECMD 虽然 C++ 变编的,但是为了缩小体积,禁止了 异常 机制。
这里的错误是函数的返回值, 或 GetLastError() 取得。
PECMD 的 错误码 不要太认真。 一般保证0为成功,非0不成功。


3:
[CALL $X:\Windows\System32\Macromed\Flash\Flash10k.ocx] <2147500034>:不支持此接口
[CALL $inetcomm.dll] <2147500034>:不支持此接口
[CALL $X:\Windows\SYSTEM32\sysmon.ocx] <2147500033>:尚未实现
说明:以上是4。0的代码,如果为代码的问题,请问2012的正确代码如何写?如果不是,请楼主实现,谢谢。

A:
(1)是不是先要 转移到 目标目录
PATH   @X:\Windows\System32\Macromed\Flash
或  
CALL $**cd  X:\Windows\System32\Macromed\Flash\Flash10k.ocx

(2) 还有 改 DLL、OCX正常吗?

(3) 是不是需要其它DLL、OCX支持。顺序有问题吗?
上面的返回码,可能是 改DLL、OCX 是执行了,当内部错误,内部返回上面返回码, PECMD 直接返回 这些 返回码。
inetcomm.dll 可能需要先调用其它 DLL、OCX 。

(4) 可以用MS 的 regsvr32.exe 先试试。

[ 本帖最后由 mdyblog 于 2013-2-8 10:54 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2013-2-7 18:14:23 | 显示全部楼层
原帖由 2011hwo1 于 2013-2-7 17:21 发表
FORX命令能不能支持cmd下dir命令所支持的/o的有命令选项,或者dir命令支持的所有选项,这样dir命令可以去掉了,而且速度比dir命令快.


CMD.EXE  是必须的。
PECMD 不是要取代一切。 主要是 一个 图形化脚本 解释器。

其它不常见的排序, 可以用脚本实现。
先 FORX 全部读进来。
再 FORX  排序。

[ 本帖最后由 mdyblog 于 2013-2-7 18:52 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2013-2-7 22:37:30 | 显示全部楼层

命令别名: PECMD2012.1.73.1-130207-3.多窗口线程孵化版_win32.sfx.zip

1: 定义 命令别名
ENVI  &&&Alias 命令别名=命令部分


命令部分 可以是个复杂部分,包刮部分参数。


2: 使用别名
命令别名 可以直接  当作 内部命令。

ENVI  &&&Alias  MyMess=mess+icon4


MyMess  HELLO

3: 可以用来 直接导入 DLL 的函数
如:

//导入  IPHLPApi.DLL 的函数 IcmpCreateFile
ENVI &&&Alias IcmpCreateFile=CALL $**ret:*  IPHLPApi.DLL,IcmpCreateFile,

// 使用 别名 IcmpCreateFile
IcmpCreateFile  &hIcmpFile  //打开ICMP句柄,返回值赋给 &hIcmpFile


[ 本帖最后由 mdyblog 于 2013-2-7 22:41 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2013-2-8 10:57:12 | 显示全部楼层
FILE 错误码

113
The source and destination files are the same file.
114
Multiple file paths were specified in the source buffer, but only one destination file path.
115
Rename operation was specified but the destination path is a different directory. Use the move operation instead.
116
The source is a root directory, which cannot be moved or renamed.
117
The operation was canceled by the user, or silently canceled.
118

The destination is a subtree of the source.

120

Security settings denied access to the source.

121

The source or destination path exceeded or would exceed MAX_PATH.

122

The operation involved multiple destination paths, which can fail in the case of a move operation.

124

文件路径无效.

125

The source and destination have the same parent folder.

126

The destination path is an existing file.

128

The destination path is an existing folder.

129

The name of the file exceeds MAX_PATH.

130

The destination is a read-only CD-ROM, possibly unformatted.

131

The destination is a read-only DVD, possibly unformatted.

132

The destination is a writable CD-ROM, possibly unformatted.

133

The file involved in the operation is too large for the destination media or file system.

134

The source is a read-only CD-ROM, possibly unformatted.

135

The source is a read-only DVD, possibly unformatted.

136

The source is a writable CD-ROM, possibly unformatted.

183

MAX_PATH was exceeded during the operation.

10026

未知错误. 通常是路径无效.(Vista之前版本才有)

65536

An unspecified error occurred on the destination.

65652

Destination is a root directory and cannot be renamed.




[ 本帖最后由 mdyblog 于 2013-2-8 11:01 编辑 ]
回复

使用道具 举报

发表于 2013-2-10 10:36:34 | 显示全部楼层
WCS关联批处理文件有错误,内容应该为:
::@echo off
SET BASEDIR=%~dp0
set BASEDIR_=%BASEDIR%
set SystemRoot_=%SystemRoot%

SET PECMD=PECMD.EXE
if exist "%BASEDIR%PECMD.EXE" SET PECMD=\"%BASEDIR_%PECMD.EXE\"
if exist "%BASEDIR%PECMD.NTR" SET PECMD=\"%BASEDIR_%PECMD.NTR\"
if exist %SystemRoot%\SYSTEM32\PECMD.EXE SET PECMD=%SystemRoot_%\SYSTEM32\PECMD.EXE
if exist %SystemRoot%\SYSTEM32\PECMD.NTR SET PECMD=%SystemRoot_%\SYSTEM32\PECMD.NTR

SET EDIT=notepad
if exist "X:\Program Files\ULTRAEDT\UEDIT32.EXE" SET EDIT=\"X:\Program Files\ULTRAEDT\UEDIT32.EXE\"
if exist X:\Programs\ULTRAEDT\UEDIT32.EXE        SET EDIT=X:\Programs\ULTRAEDT\UEDIT32.EXE
if exist X:\Program\ULTRAEDT\UEDIT32.EXE         SET EDIT=X:\Program\ULTRAEDT\UEDIT32.EXE
if exist X:\Program1\ULTRAEDT\UEDIT32.EXE        SET EDIT=X:\Program1\ULTRAEDT\UEDIT32.EXE
if exist "C:\Program Files\ULTRAEDT\UEDIT32.EXE" SET EDIT=\"C:\Program Files\ULTRAEDT\UEDIT32.EXE\"
if exist "%BASEDIR%UEDIT32.EXE" SET EDIT=\"%BASEDIR_%UEDIT32.EXE\"

SET EDIT2=-
if exist %SystemRoot%\SYSTEM32\PECMDEDIT.EXE SET EDIT2=%SystemRoot_%\SYSTEM32\PECMDEDIT.EXE
if exist %SystemRoot%\SYSTEM32\PECMDEDIT.NTR SET EDIT2=%SystemRoot_%\SYSTEM32\PECMDEDIT.NTR
if exist %SystemRoot%\SYSTEM32\PECMDEDIT.NTR SET EDIT2=%SystemRoot_%\SYSTEM32\PECMDEDIT.NTR
if exist %SystemRoot%\SYSTEM32\PECMDEDIT.NTR SET EDIT2=%SystemRoot_%\SYSTEM32\PECMDEDIT.NTR
if exist "%BASEDIR%PECMDEDIT.EXE" SET EDIT2=\"%BASEDIR_%PECMDEDIT.EXE\"
if exist "%BASEDIR%PECMDEDIT.NTR" SET EDIT2=\"%BASEDIR_%PECMDEDIT.NTR\"

REG ADD HKCR\.ntr   /ve  /d exefile  /f
REG ADD HKCR\.nte   /ve  /d exefile  /f
REG ADD HKCR\.ntx   /ve  /d exefile  /f
REG ADD HKCR\.wcs   /ve  /d wcsfile  /f
REG ADD HKCR\.wce   /ve  /d wcsfile  /f
REG ADD HKCR\.wcx   /ve  /d wcsfile  /f
REG ADD HKCR\.wci   /ve  /d wcsfile  /f
REG ADD HKCR\wcsfile   /ve  /d "WCS 脚本文件"  /f
REG ADD HKCR\wcsfile\DefaultIcon /ve   /d "%PECMD%",0  /f
REG ADD HKCR\wcsfile\shell\open\command /ve   /d  "%PECMD% LOAD \"%%L\""  /f
REG ADD HKCR\wcsfile\shell\Edit\command /ve   /d  "%EDIT% \"%%L\""  /f

REG ADD HKCR\.wcz   /ve  /d wczfile  /f
REG ADD HKCR\wczfile   /ve  /d "WCS 脚本文件"  /f
REG ADD HKCR\wczfile\DefaultIcon /ve   /d "%PECMD%",0  /f
REG ADD HKCR\wczfile\shell\open\command /ve   /d  "%PECMD% LOAD \"%%L\""  /f


REG ADD HKCR\inifile\shell\PECMD /ve   /d  "PECMD 运行"  /f
REG ADD HKCR\inifile\shell\PECMD\command /ve   /d  "%PECMD% LOAD \"%%L\""  /f

REG ADD HKCR\inifile\shell\PECMDEDIT /ve   /d  "PECMD 编辑"  /f
REG ADD HKCR\inifile\shell\PECMDEDIT\command /ve   /d  "%EDIT% \"%%L\""  /f

@IF  "-"=="%EDIT2%" goto SKIPEDUT2
REG ADD HKCR\inifile\shell\1PECMDEDIT /ve   /d  "PECMDEDIT 编辑"  /f
REG ADD HKCR\inifile\shell\1PECMDEDIT\command /ve   /d  "%EDIT2% \"%%L\""  /f
REG ADD HKCR\wcsfile\shell\1PECMDEDIT /ve   /d  "PECMDEDIT 编辑"  /f
REG ADD HKCR\wcsfile\shell\1PECMDEDIT\command /ve   /d  "%EDIT2% \"%%L\""  /f
:SKIPEDUT2

REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PATHEXT   /d  ".COM;.EXE;.NTR;.NTE;.NTX;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.WCS;.WCE;.WCX;.WCZ"  /f

有几个地方没有加引号,到账reg命令出现命令行参数过多,而无法修改注册表的现象.
回复

使用道具 举报

 楼主| 发表于 2013-2-10 14:53:16 | 显示全部楼层

回复 #4700 2011hwo1 的帖子

新年好啊!
已更新。
回复

使用道具 举报

发表于 2013-2-10 18:17:45 | 显示全部楼层
回复 #4701 mdyblog  的帖子
mdyblog大师你也是新年好啊!
怎么获取快捷方式的指向文件名?
回复

使用道具 举报

 楼主| 发表于 2013-2-10 18:37:18 | 显示全部楼层
原帖由 2011hwo1 于 2013-2-10 18:17 发表
回复 #4701 mdyblog  的帖子
mdyblog大师你也是新年好啊!
怎么获取快捷方式的指向文件名?


你是说,有人建立了一个D:\A.LNK
快捷方式。
你现在想知道这个 D:\A.LNK 指向那个文件吗?
回复

使用道具 举报

发表于 2013-2-10 19:44:00 | 显示全部楼层
你说的没有错!!!!!!!!!!!!
回复

使用道具 举报

发表于 2013-2-10 20:51:16 | 显示全部楼层
#code=936 这个功能很不错
连在繁体系统上运行都不会乱码...试了一下跑PING2.WCS mess出来的字不乱码呢...

继续期待你的64位pecmd2012......

[ 本帖最后由 andos 于 2013-2-10 21:53 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2013-2-11 02:17:33 | 显示全部楼层
原帖由 2011hwo1 于 2013-2-10 18:17 发表
回复 #4701 mdyblog  的帖子
mdyblog大师你也是新年好啊!
怎么获取快捷方式的指向文件名?


PECMD2012.1.73.1-130210.多窗口线程孵化版_win32.sfx.zip

LINK ? [**f]  快捷方式路径,[目标路径名][,运行参数名][,图标路径名[#[图标索引名]]][,备注名][,起始位置名][,快捷键名][,显示标志名]    //查询  
**f则不自动补充".LNK"。
LINK ?  %DeskTop%\HPRSNAP,&FN,&ARG,&ICON#&IICON,&COMMENT,&START,&KEY,&ISHOW
MESS [%&FN%]  [%&ARG%] [%&ICON%][%&IICON%]  [%&COMMENT%]  [%&START%] [%&KEY%] [%&ISHOW%]
// [D:\SOFT\HYPERSNAP6\HPRSNAP6.NTR]  [a  bb cc] [%SystemRoot%\system32\SHELL32.dll][13]  [XXX YYY]  [D:\SOFT\HYPERSNAP6] [632] [3]

其实,可以直接调用系统的DLL,获得 快捷方式的指向文件名。下面是C++程序,有兴趣可以试着用
脚本实现。

BOOL ReadShortCut(LPWSTR linkName, CString &FilePath)        
{        
    ::CoInitialize(NULL);        
    IShellLink *m_pIShellLink=NULL;        
    IPersistFile *m_pIPersistFile=NULL;
    HRESULT hr=::CoCreateInstance(CLSID_ShellLink,NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&m_pIShellLink);        
    if(hr==S_OK)        
    {        
        hr=m_pIShellLink->QueryInterface(IID_IPersistFile,(void **)&m_pIPersistFile);        
        if(hr==S_OK)        
        {        
            USES_CONVERSION;         
            m_pIPersistFile->Load(linkName,STGM_READ);        
            wchar_t m_strPath[1050+1]; m_strPath[0]=0;        
            //读取快捷方式的目标路径         
            m_pIShellLink->GetPath(m_strPath,1050,NULL,SLGP_UNCPRIORITY);   
            FilePath =   m_strPath; //获得文件路径
            m_pIPersistFile->Release();        
        }        
        m_pIShellLink->Release();        
    }        
    ::CoUninitialize();        
    return !!m_pIPersistFile ;        
}

评分

参与人数 1无忧币 +5 收起 理由
2011hwo1 + 5

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2013-2-11 11:25:54 | 显示全部楼层
原帖由 mdyblog 于 2013-2-11 02:17 发表


PECMD2012.1.73.1-130210.多窗口线程孵化版_win32.sfx.zip

LINK ? [**f]  快捷方式路径,[目标路径名][,运行参数名][,图标路径名[#[图标索引名]]][,备注名][,起始位置名][,快捷键名][,显示标志名]    //查 ...


增加了个功能
1》 直接地址调用:
┃CALL $[**cd ][**rcd ][**c ][**ret:返回名 ]#,函数地址[,[#]参数1][,...[,[#]参数20┃
┃CALL $[**cd ][**rcd ][**c ]**ret:* #,函数地址, [返回名][,[#]参数1][,..[,[#]参数20┃



ENVI &&&Alias IcmpCreateFile=CALL $? **ret:*  #,0x76d34d5e,
IcmpCreateFile &&hIcmpFileAddr

调用非输出的,但知道地址的函数,尤其是C++虚函数。


2》查询函数地址
┃CALL $? **ret:返回名 DLL路径,函数名称
┃CALL $? **ret:* DLL路径,函数名称, 返回名

CALL $? **ret:*  IPHLPApi.DLL,IcmpCreateFile, &&hIcmpFileAddr

MESS  IcmpCreateFile=[%&hIcmpFileAddr%]
// IcmpCreateFile=[0x76d34d5e]
回复

使用道具 举报

 楼主| 发表于 2013-2-11 14:36:43 | 显示全部楼层

MemoryCopy测试.wcs

调用内置函数 MemoryCopy
MemoryCopy测试.wcs:
CALL $? **ret:*  .,MemoryCopy, &&MemoryCopyAddr
ENVI &&&Alias MemoryCopy=CALL $**c **ret:*  #,%&MemoryCopyAddr%,
//或直接 ENVI &&&Alias MemoryCopy=CALL $**c **ret:*  .,MemoryCopy,
//MESS MemoryCopyAddr[%&MemoryCopyAddr%]
ENVI &&A=123456
ENVI &&B=ABCDEF
ENVI-addr &&AAdr=&A
ENVI-addr &&BAdr=&B

MESS A[%A%]  //[%&AAdr%,%&BAdr%]
//A[123456]  
calc -base=16 &AAdr=%&AAdr%+2  //偏移1字符
MemoryCopy &&ret,#%&AAdr%,#%&BAdr%,#6  //拷贝3个字符
MESS A[%A%]
//A[1ABC56]
//A原来内容 [123456] 偷偷变成了 [1ABC56]


[ 本帖最后由 mdyblog 于 2013-2-12 11:55 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2013-2-12 11:33:42 | 显示全部楼层

7ZIP 进度条 PECMD脚本?

想作个 7ZIP 进度条  的PECMD脚本。
谁有 7Zip.au3,请发一个上来。
我转化为PECMD PECMD脚本。

我下了个 AutoIT3 ,奇怪里面没有这个文件。
回复

使用道具 举报

发表于 2013-2-12 12:28:01 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2013-2-12 14:02:42 | 显示全部楼层
原帖由 andos 于 2013-2-12 12:28 发表
https://code.google.com/p/unixp/source/browse/trunk/lib/7z.au3?r=11
http://read.pudn.com/downloads153/sourcecode/zip/668498/7Zip.au3__.htm

这些是吗?

正是!!!!!!!!!!!!!!!!!!!!!!!!
回复

使用道具 举报

 楼主| 发表于 2013-2-12 20:06:47 | 显示全部楼层
原帖由 clonecd 于 2013-2-12 19:25 发表


C/C++的memcpy或memmove?

已改成 memmove .                   
回复

使用道具 举报

 楼主| 发表于 2013-2-12 20:38:53 | 显示全部楼层
原帖由 andos 于 2013-2-12 12:28 发表
https://code.google.com/p/unixp/source/browse/trunk/lib/7z.au3?r=11
http://read.pudn.com/downloads153/sourcecode/zip/668498/7Zip.au3__.htm
这些是吗?

PECMD2012.1.73.1-130212.多窗口线程孵化版_win32.sfx.zip


test7zip.wcs(包内有):


//需要7_zip32.dll   
// 导出7_zip32.dll的 3个函数
ENVI &&&Alias *opt SevenZipSetOwnerWindowEx=CALL $**ret:*  7_zip32.dll,SevenZipSetOwnerWindowEx,
ENVI &&&Alias *opt SevenZip=CALL $**ret:*  7_zip32.dll,SevenZip,
ENVI &&&Alias *opt SevenZipClearOwnerWindow=CALL $**ret:*  7_zip32.dll,SevenZipClearOwnerWindow,
ENVI &&&alias *opt MemoryCopy=CALL $**c **ret:*  .,MemoryCopy,

CALL $? **ret:*  .,WndProc1, &&WndProc1Addr //回调函数壳,反射回来调用 CALL OnWndProc1 参数  
ENVI &&WM_PEBASE=0x5000    //PECMD 起始消息号
CALC #&&WM_7ZIP=%WM_PEBASE% + 0x101

WIN1
_SUB WIN1,W365H192,7Zip进度,TEAM ENVI &closeit=1|ENVI &doit=0
    ITEM ITEM3,L50T21W60H30,解压, CALL OnJieYa,
    EDIT &SRC,L120T23W190H25,test.7z,,0x100
    LABE &LNAME,L37T71W288H18,,,
    PBAR &PBAR1,L36T91W289H16,0
    LABE -right &LSZIE,L223T116W102H20,,,
    ITEM ,L52T115W60H30,终止, ENVI &doit=0,
    ENVI @this.MSG=%&WM_7ZIP%::&&nState,&&lptag,CALL OnWM_7ZIP
    ENVI &&ok=-1
    ENVI &&closeit=0
    ENVI &&doit=1  //0为取消
    ENVI &&WID=%__WINID%
_END
_SUB  OnJieYa
    FIND $X=X%&SRC%, EXIT
    ENVI &&WID=%__WINID%
    IFEX %&SRC%,! TEAM MESS+icon0 %&SRC% 不存在| EXIT
    ENVI &&wcmd=x  %&SRC% -y -hide
    ENVI-tom &&acmd=&wcmd   // ANSI 编码的命令
    ENVI-addr &&acmdadr=&acmd
    ENVI#% &&buf=*32768
    ENVI-addr &&bufadr=&buf
    ENVI &closeit=0  //
    ENVI &ok=-1
    ENVI &doit=1  //
    ENVI &&&WndProc1   // WndProc1 绑定到当前 PE执行栈,以寻找 OnWndProc1 函数
    SevenZipSetOwnerWindowEx &&ret,#%__WINID% ,#%&WndProc1Addr%    //绑定到父窗口和回调函数
    SevenZip &&ret,#%__WINID%,#%&acmdadr%,#%&bufadr%,#32768    //开动7ZIP
    SevenZipClearOwnerWindow &&ret  //父窗口和回调函数 解绑
    ENVI &&&WndProc1=0  // WndProc1 解绑
    IFEX  $1=%&closeit%, EXIT
    IFEX  $-1=%&ok%,  MESS+icon6  解压失败@7ZIP解压演示 #OK
    IFEX  $1=%&ok%,  MESS+icon2  解压完成@7ZIP解压演示 #OK
    IFEX  $0=%&ok%,  MESS+icon0  解压取消@7ZIP解压演示 #OK
_END

_SUB OnWM_7ZIP
    IFEX $%lptag%>0,   //结构地址非0
    {
        ENVI-make &&tag=%lptag%;8
        GETF -bin &&tag,0#8,&&tagHex
        MSTR &&FSZ1,&&FSZ2,&&FSZ3,&&FSZ4,&&WSZ1,&&WSZ2,&&WSZ3,&&WSZ4=<1*>%&tagHex%
        CALC  #&&FS=%&FSZ1% + %&FSZ2% * 0x100 + %&FSZ3% * 0x10000 + %&FSZ4% * 0x100000  //总长度
        CALC  #&&WS=%&WSZ1% + %&WSZ2% * 0x100 + %&WSZ3% * 0x10000 + %&WSZ4% * 0x100000  //已写长度
        CALC #&&percent=(100* %&WS% ) / %&FS%
        
        // 524  + 513
        CALC #&&dstfnadr=%lptag% + 524  
        ENVI#$  &&dst=*513 0 //
        ENVI-addr &&dstadr=&dst
        MemoryCopy  ,#%&&dstadr%,#%&dstfnadr%,#513
        ENVI-tow  &&wdst=&dst
        
        ENVI @&PBAR1=%&percent%
        ENVI @&LSZIE=%&WS%/%&FS%
        ENVI @&LNAME=%&wdst%
    }
    IFEX $2=%&nState%, TEAM  ENVI  &ok=%&doit% // MESS 完成
_END
// WndProc1 调用用户脚本函数 OnWndProc1
//OnWndProc1 hWnd nMsg nState  lptagEXTRACTINGINFOEX
_SUB  OnWndProc1
    ENVI @@SENDMSG=%&WID%;%&WM_7ZIP%;%3;%4
    exit= %&doit% //返回1=继续  0=终止   
_END
     

7z.gif
压缩命令:
   ENVI &&wcmd=a  7ZIP文件名 源文件...   -y -hide   //7zip压缩命令

后面还可以解其他选项

-p密码
-mx压缩级别   //0~9
-sfx      //自解压
-v%Volume%   //分卷
-w工作目录

上面解压命令:
-o"解压到的目录"



回调信息结构 tagEXTRACTINGINFOEX
struct tagEXTRACTINGINFOEX
{
   long dwFileSize;  //总长度    4Byte
   long dwWriteSize; //已写长度  4Byte
   char szSourceFileName[513];
   char dummy1[3];
   char szDestFileName[513];
   char dummy[3];
   long dwCompressedSize;
   long dwCRC;
   long uOSType;
   long wRatio;
   long wDate;
   long wTime;
   char szAttribute[8];
   char szMode[8];
};




[ 本帖最后由 mdyblog 于 2013-2-14 14:43 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2013-2-12 20:53:02 | 显示全部楼层
原帖由 clonecd 于 2013-2-12 20:42 发表


7ZIP的自解压在一些Native PE中会导致死机的哦。


另外 我从 HaoZip 提取命令行版,不同于7za.exe ,HaoZipC.exe 的输出,能实时捕作,用于分析促进度信息.
(7za.exe有内部输出信息缓冲,到最后才一步显示出来,捕作到是已没有意义了)
回复

使用道具 举报

 楼主| 发表于 2013-2-12 20:54:24 | 显示全部楼层
原帖由 clonecd 于 2013-2-12 20:42 发表


7ZIP的自解压在一些Native PE中会导致死机的哦。


用的不是自解压. 是用 7_zip32.dll 来外部解压.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-9-10 03:24

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表