123
发表于 2007-1-27 22:39:54
楼主不提供源码,无法知道具体技术细节,只有一个现成的程序。不过反正更多的人只是关心这个文件,对具体技术细节漠不关心,也好。
lxl1638
发表于 2007-1-27 22:52:19
IFEX、FONT命令的源码已帖了一次,只是一楼文字太多了,所以暂时不帖了。
也很简单,如命令组为:
命令1|命令2|命令3|命令4|命令5
则分解为两部分, 命令1 和 后面的命令组(命令2|命令3|命令4|命令5),先执行 命令1,再将 后面的命令组(命令2|命令3|命令4|命令5)递归,直到命令组内没有命令为止。
译成中文就是这样:
执行命令组的函数名(参数命令组字符串)
{
从命令组字符串分解出命令1;
如果存在 命令1
{
执行命令1;
执行命令组的函数名(余下的命令组字符串); //这里是递归,算法很简单,也没有必要帖一次。
}
}
[ 本帖最后由 lxl1638 于 2007-1-27 11:58 PM 编辑 ]
dgxhls
发表于 2007-1-27 22:59:22
老九辛苦了。
123
发表于 2007-1-27 23:04:23
我的意思是,那些命令是通过调用什么函数修改注册表的哪些地方实现的?我猜安装字体是调用AddFontResource函数。
lxl1638
发表于 2007-1-27 23:09:08
原帖由 123 于 2007-1-27 11:04 PM 发表
我的意思是,那些命令是通过调用什么函数修改注册表的哪些地方实现的?我猜安装字体是调用AddFontResource函数。
不错,安装字体命令的源码已帖在1楼差不多两天了,原作者也看过,讨论过,今晚才删的,1楼的文字太多,源码帖过了,原作者也认为没有什么大问题我就删了一楼的部分内容。关心源码的人很少,关心如何使用的人很多,所以一些对一般人来说与使用无关的文字我还要及早删。
[ 本帖最后由 lxl1638 于 2007-1-27 11:11 PM 编辑 ]
123
发表于 2007-1-27 23:09:14
原帖由 gues1688 于 2007-1-27 11:01 PM 发表
谢谢lxl1638大师!
SEND命令能否改一下?不使用数字代码,改用键盘的字符代码。用数字代码,不要说别人了,就是自己如果不查代码对照表恐怕也认不出代表什么键吧?
感谢!
对啊,字符是char类型的数据,本身就是数字。
lxl1638
发表于 2007-1-27 23:21:18
以后还是要统一的,要么就用字符,要么就用数值,若要支持两者,必须将其中一方加 ' 号或 " 号括起来,
如数值直接用数值表示,字符则用 '字母' 表示,如 'a' ,但如象 F1~F12、Ctrl、Alt等都要用字符表示的话,要定义一大堆数据了。
lxl1638
发表于 2007-1-27 23:26:09
HRESULT RegFont(PTSTR tzPath)
{
WIN32_FIND_DATA fd;
TCHAR szFullPathName;
HRESULT hResult=ERROR_FILE_NOT_FOUND;
HANDLE hFind = FindFirstFile(tzPath, &fd);
UDirSplitPath(tzPath);
if (hFind != INVALID_HANDLE_VALUE)
{
do
{
if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY)
{
UStrPrint(szFullPathName, TEXT("%s\\%s"), tzPath,fd.cFileName);
AddFontResource(szFullPathName);
}
}
while (FindNextFile(hFind,&fd));
FindClose(hFind);
hResult = (HRESULT) SendMessage(HWND_BROADCAST,WM_FONTCHANGE, 0, 0);
}
return hResult;
}
///////////////////////////////////////////////////////////
//REG FONT
HRESULT Font(PTSTR ptzCmd)
{
TCHAR tzPath;
HRESULT hResult=ERROR_FILE_NOT_FOUND;
if (ptzCmd == '\\')
{
ptzCmd++;
TCHAR tzDrives;
GetLogicalDriveStrings(MAX_NAME, tzDrives);
for (PTSTR p = tzDrives; *p; p += UStrLen(p) + 1)
{
UStrPrint(tzPath, TEXT("%s%s\\Fonts"), p, ptzCmd);
if (UDirExist(tzPath))
{
UStrCat(tzPath, TEXT("\\*.*"));
hResult = RegFont(tzPath);
}
}
}
else
{
if (UDirExist(ptzCmd)) UStrCat(ptzCmd, TEXT("\\*.*"));
UStrPrint(tzPath,TEXT("%s"),ptzCmd);
UDirSplitPath(ptzCmd);
if (UDirExist(ptzCmd))
{
hResult = RegFont(tzPath);
}
}
return hResult;
}
[ 本帖最后由 lxl1638 于 2007-1-27 11:27 PM 编辑 ]
strongchen
发表于 2007-1-27 23:30:56
不懂编程,不过支持开发代码(使用者自觉保留作者信息)
lxl1638
发表于 2007-1-27 23:31:25
单个字母好办,难就是那控制键,如F1~F12、Ctrl、Alt、Shift、End、Home、Del等一大堆。
lxl1638
发表于 2007-1-28 00:35:40
原帖由 strongchen 于 2007-1-27 11:30 PM 发表
不懂编程,不过支持开发代码(使用者自觉保留作者信息)
XCMD我会保留原作者的信息的,到目前说明文件都没改动。不象以前有些人把XPEHELP.EXE改得面目全非。
另一方面,无忧的WinPE有几个不是从老九WinPE修改而成的?又有几个能保留原制作人的信息的?
lijing4278
发表于 2007-1-28 01:17:33
好东西,谢谢了
qcqtye
发表于 2007-1-28 01:18:46
支持了.不会用的说.我只希望能个下载最简单的.
Yonsm
发表于 2007-1-28 03:12:36
既然这么多人说源码,就把整个工程贴出来吧。也好有个参考。XCMD说明文件中的最后的许可中也这样说了。
"◎ 如果您使用或修改了其中任何的源代码,则必须把使用这些源代码的项目以及项目内的所有源代码和文档公开。否则禁止使用本程序源代码的任何部分。"heihei
不过我建议新搞的可以自己修改说明之类的,包括作者信息,这没什么关系。但我觉得关键是继续把你的成果共享下去。养成好习惯良性循环。反正用的人越多,越有成就感麻。
acoa
发表于 2007-1-28 08:12:21
原帖由 lxl1638 于 2007-1-28 12:35 AM 发表
XCMD我会保留原作者的信息的,到目前说明文件都没改动。不象以前有些人把XPEHELP.EXE改得面目全非。
另一方面,无忧的WinPE有几个不是从老九WinPE修改而成的?又有几个能保留原制作人的信息的?
在一个工具当中,存在作者的信息是很正常。但在一个系统当中,很多人都不喜欢有别人信息的存在。现在太多人都把PE当作一个系统来玩,所以都不想有别人信息在里面。并不说要篡改原作者的作品,并因此成了自己的作品。每个人需要的功能不同,有人要维护,有的人要网络,有的要声音,才造就了各种版本PE的出现,这是一件非常好的事。一个人不可能满足所有人的需求,这就需要大家来维护。例如:很多人想要声音,但也有很多人始终不认同这种PE,但确实有这种需求,因此就有了声音版本的出现。大家在论坛是说是XX的版本,并不是说这个PE就成了XX的作品,只是在交流问题时用来区别版本而已。
123
发表于 2007-1-28 12:02:40
源码看了头大,只需说明用了哪些函数或改了注册表什么地方就行了,会编程的人自己就知道该怎么做,不会编程的人就是有完整源码也不明白。
songq
发表于 2007-1-28 14:02:29
我试了最新的功能,没搞明白,是不是有了那个font命令。img里的fonts目录也可以外置了
另外,file命令->,=>好用吗,我试了怎么不行啊
lxl1638
发表于 2007-1-28 14:29:01
一楼已说明,字体完全可以外置,也可以利用硬盘上原有的Windows字体。
比如你的Windows字体在 硬盘的 Windows\Fonts 目录下(那个分区都行),FONT 命令的参数则为 :
FONT \Windows
它会查找硬盘的所有分区的Windows\Fonts 目录,并安装字体,若不明的建议下载1.27的YY版看看,看明了再定义自己的PE。
沙漠之子
发表于 2007-1-28 16:11:10
并不是每人关心源代码,只是本人没学过c++,不懂编程
不过会在使用的过程中,现学现用的说
zhaohj
发表于 2007-1-28 16:15:17
XCMD 2.2.RAR (2007-1-28 12:22 PM, 95.13 K)里面的xcmd.exe替换1.27版中,中途卡死,其他什么都没改,是不是命令命名不一样?
lxl1638
发表于 2007-1-28 16:21:29
有所不同,1月.27日YY版IMG中的XCMD有一条命令SHEL,修改版工程源码中没有这个命令。
加入这个命令的目的是为以后锁定SHELL作准备。
你将 XCMD.INI中 SHEL 改为 EXEC 命令试试。
haoren2880
发表于 2007-1-28 16:24:01
与时俱进
zhaohj
发表于 2007-1-28 17:39:04
原帖由 lxl1638 于 2007-1-28 04:21 PM 发表
有所不同,1月.27日YY版IMG中的XCMD有一条命令SHEL,修改版工程源码中没有这个命令。
加入这个命令的目的是为以后锁定SHELL作准备。
你将 XCMD.INI中 SHEL 改为 EXEC 命令试试。
没仔细看,SHEL命令也加上了,改成EXEC没问题。
sunsmile23
发表于 2007-1-28 18:51:43
原帖由 lxl1638 于 2007-1-28 12:35 AM 发表
XCMD我会保留原作者的信息的,到目前说明文件都没改动。不象以前有些人把XPEHELP.EXE改得面目全非。
另一方面,无忧的WinPE有几个不是从老九WinPE修改而成的?又有几个能保留原制作人的信息的?
老九大量点吧。谁的版本也没有老九、老毛的人气旺。并且谁也忘不了老九的贡献。
songq
发表于 2007-1-28 18:58:34
原帖由 lxl1638 于 2007-1-28 02:29 PM 发表
一楼已说明,字体完全可以外置,也可以利用硬盘上原有的Windows字体。
比如你的Windows字体在 硬盘的 Windows\Fonts 目录下(那个分区都行),FONT 命令的参数则为 :
FONT \Windows
它会查找硬盘的所有分区的W ...
老九请看,我将img里的fonts目录移到外置程序里面,乱码,xlog提示函数不正确。
并且file的->,=>移动,复制命令也不成功。
lxl1638
发表于 2007-1-28 19:36:08
基本的字体还是要有的,TEXT命令本身要有默认的字体支持(下面的第二条命令,第1条命令是本人加上去的,支持设置字体的大小)。
hfont = CreateFont(fontsize, 0, 0, 0, 400, 0, 0, 0,
ANSI_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_DONTCARE, TEXT("Tahoma"));
(hfont ? SelectObject(ps.hdc, hfont): SelectObject(ps.hdc, GetStockObject(DEFAULT_GUI_FONT)));
移动,复制命令是应该是 -}、=},这个是2.0版的说明,但2.2版变成了,->、=>,究竟是那个才对,本人还没看源码,或者你试试用2.0版的语法。
[ 本帖最后由 lxl1638 于 2007-1-28 07:41 PM 编辑 ]
songq
发表于 2007-1-28 19:55:47
跟我想象的不一样,我还以为img又可以减掉2M的大小呢。
lxl1638
发表于 2007-1-28 19:57:03
原帖由 songq 于 2007-1-28 07:55 PM 发表
跟我想象的不一样,我还以为img又可以减掉2M的大小呢。
保留英文字体,先删中文字体试试,只是TEXT命令不能用中文了。
songq
发表于 2007-1-28 20:17:26
我按你说的又试了一下,不行,中文显示不了,但text始终是显示中文的。
hfont = CreateFont(fontsize, 0, 0, 0, 400, 0, 0, 0,
ANSI_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_DONTCARE, TEXT("Tahoma"));
是不是TEXT("Tahoma")这里改成simtun就可以了。因为我看到记事本里默认字体就是Tahoma,改成宋体,内容就可以显示了。
lxl1638
发表于 2007-1-28 20:28:28
可能没有中文字体是不行的,第一次设置字体大小是用simtun,考虑到XCMD可能要支持更多的系统(如繁体版PE),就换成了Tahoma字体,因为这个字体在所有系统中都要有的。
到此也不打算换成simtun,目的是以后若有人做繁体版PE要用这个工具时能用得上。