WINHEX高级专题第三讲
实战WINHEX API函数(1)
困惑的浪漫(高志鹏)
初看这个题目,大家一定感到非常诧异,几个月前,大家跟随我制定的学习路线,了解了语言变量、表达式的初步知识,更学习了如何活用WINHEX脚本,使之拥有实现某些高级编程语言特性的方法.当然,这些特性都是最初级最简单不过的了.变量、表达式对程序本身来说是重要的地基,但对编程的学习框架来说,只是微不足道的入门理论.活用变量、表达式,能给WINHEX脚本带来脱胎换骨的变化,但是却无法使其提升到结构化编程的更高层级---函数.今天我们就要迈上一个更高的台阶,如果各位兄弟感到吃力是可以理解的,但是不能轻言放弃,还是那句老话只要努力,就没有困难.
首先,要明确一点,本讲内容是磁盘函数编程的入门知识,但不是函数编程语法的入门知识,语法大家要背后下苦功.相信学习过程艰苦而漫长,我选择WINHEX API为入门素材是因为它是函数体系中结构比较简单的,更容易学习.运用WINHEX API只是利用别人的函数完成自己的功能,本人最终的目的是让各位拥有独立改造、编写函数功能的能力,继而拥有设计类型,接口平台的能力,从而带领大家创造一套功能更强大,智能程度更高的全新WINHEX来.
WINHEX有三个指令接受接口:
一、基于界面操作的:也就是我在《WINHEX困惑的浪漫教程》中所演示的
窗体交互、菜单点击、文本修改等“傻瓜操作”。当然,绝大部分WIN32
程序都有此功能。
二、基于脚本解释的:WINHEX脚本大家也学习得够多了,如果设计得当,
功能是非常强大的,但它毕竟是生存于WINHEX大平台之上的,有局
限性。
三、基于API的:也就是应用程序接口,往往是软件厂商为二次开发而预
留的。WINHEX API就是一座概括WINHEX基本功能的古老函数库。但是,无论如何,这三种接口最终都会归于一体:WINHEX元函数。也就是WINHEX作者编写WINHEX的时设计的功能函数。简单的说,“Open D:”
和菜单中的“打开逻辑磁盘”实际调用了同一个元函数,而这个元函数的深层实质上又调用了操作系统API。这些都是我以后要讲解的高深内容,这里不再细谈。
WINHEX 官方公布的API有四十个左右,它们的功能和形态与脚本非常相似,使用上又有颇多限制,比如必须是专家及以上版本,或者是个人版额外购买了API授权序列号。可惜的是,由于祖国的盗版事业,这些版本我们手头都有,不影响学习。
WINHEX API国内没有学习资料,但这并不代表它们高深,优秀的程序员只需观察其函数参数就可以判断出它们的使用方法,何况官方还给了一份简介文档。下面我们就按照官方给出的顺序,一一详解,本讲我们主要关注前三个函数,也是最重要的三个函数。
大家先观察下面的代码:
……{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int a = 1;
int WINHEXSTARTNUM = WINHEXAPI.WHX_Init(a);
MessageBox.Show(WINHEXSTARTNUM.ToString(), "返回指示信号:");
if (WINHEXSTARTNUM == 1)
{
// WINHEXAPI.WHX_OpenEx("80h", 0x00000001);
if (WINHEXAPI.WHX_Open("80h") == true)
{
/
/WINHEXAPI.WHX_Create(@"E:\困惑的浪漫.txt", 1000000);
WINHEXAPI.WHX_Find("0xEB52904E","Down SaveAllpose");
if (WINHEXAPI.WHX_WasFound() == true)
{
MessageBox.Show("到了!!!");
}
WINHEXAPI.WHX_Done();
}
else
{
WINHEXAPI.WHX_Done();
}
}
else if (WINHEXSTARTNUM == 0)
{
MessageBox.Show("常规错误!!!", "高志鹏警告您:");            }
else if (WINHEXSTARTNUM == -1)
{
MessageBox.Show("未准备好!!!", "高志鹏警告您:");            }
else if (WINHEXSTARTNUM == -2)
{
MessageBox.Show("版本不正确!!!", "高志鹏警告您:");            }
else if (WINHEXSTARTNUM == -3)
{
MessageBox.Show("未取得充足许可权限!!!", "高志鹏警告您:");
}
else
{
最浪漫的编程代码简单MessageBox.Show("WINHEXAPI异常,请仔细检查!!!","高志鹏警告您:");
}
}
}
class WINHEXAPI
{
[DllImport("whxapi.dll",SetLastError=true,CharSet=CharSet.Ansi)]
public static extern int WHX_Init(int APIVersion );
[DllImport("whxapi.dll",SetLastError=true,CharSet=CharSet.Ansi)]
public static extern bool WHX_Done();
[DllImport("whxapi.dll",SetLastError=true,CharSet=CharSet.Ansi)]
public static extern bool WHX_Open(string lpResName);
[DllImport("whxapi.dll",SetLastError=true,CharSet=CharSet.Ansi)]
public static extern bool WHX_Create( string lpPathName,int
Size);
[DllImport("whxapi.dll",SetLastError=true,CharSet=CharSet.Ansi)]
public static extern bool WHX_OpenEx(string lpResName, int Param);
[DllImport("whxapi.dll",SetLastError=true,CharSet=CharSet.Ansi)]
public static extern bool WHX_Find(string lpData,string lpOptions);
[DllImport("whxapi.dll",SetLastError=true,CharSet=CharSet.Ansi)]
public static extern bool WHX_WasFound();
}
}……
里面牵扯了两个类,一个用于执行函数,一个用以声明DLL中的内容。这里要注意,使用WINHEX API尽量采用安装版的WINHEX,否则可能会有不确定的错误因素,或者无效。API DLL尽量拷贝至SYSTEM32或本程序所在目录下.也可以显示给出DLL路径,但这不利于程序移植和维护,注意使用的DLL有VB版,VC版等几种,这里我们用的是VC DLL.
int WINHEXSTARTNUM = WINHEXAPI.WHX_Init(a);这一句是WINHEX API的首次使用,等号右边就是API文档提到的第一个函数:初始化函数:
int WHX_Init( int APIVersion );
2 Success (limited)*
1 Success
0 General error
-1
WinHex installation not
ready
-2 APIVersion incorrect
-3Invalid or insufficient

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。