📄 01_9_17_15.asp.html
字号:
<=0x00a7 && (key&0xff00)>=0xa100)</td></tr></table><table width=100% ><tr><td class=a14>
||(((key&0x00ff)==0x00a8 || (key&0x00ff)</td></tr></table><table width=100% ><tr><td class=a14>
==0x00a9)&&((key&0xff00)!=0x7f00)))</td></tr></table><table width=100% ><tr><td class=a14>
//如 key在图形符号区</td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
int16result = key&0xff0f;</td></tr></table><table width=100% ><tr><td class=a14>
//key屏蔽位码高四位做顺序值</td></tr></table><table width=100% ><tr><td class=a14>
ofs.write( (char *) &int16result, </td></tr></table><table width=100% ><tr><td class=a14>
sizeof(int16result));</td></tr></table><table width=100% ><tr><td class=a14>
} else ofs.write( (char *) &key, 2);</td></tr></table><table width=100% ><tr><td class=a14>
//如key在用户自定义区顺序值即区位码</td></tr></table><table width=100% ><tr><td class=a14>
} //end for (int wm=0x40;wm<=0xFE;wm++) } //end for (int qm="0x81;qm<=0xFE;qm++)" i="0;" //缓冲指针清零 } } </td></tr></table><table width=100% ><tr>
<td class=a14> <b>四、 取 字 符 串 顺 序 值 的DLL </b>---- 我 们 在 获 得 两 个 顺 序 值 文 件
之 后 就 可 以 编 写 取 字 符 串 顺 序 值 的 函 数 了。 下 面 的 程 序 是 给 出 在Windows 95 下 用DLL
实 现 方 法, 需 要 说 明 的 是 为 了 支 持 中 西 文 混 合 字 串, 此 函 数 每 一 个 中 文 或 西 文 字 符
输 出 的 顺 序 值 均 四 字 节 字 符 串, 中 文 字 符 是 直 接 将 该 字 符 的 顺 序 值 转 换 成 字 串 输 出,
西 文 是 在 字 符 的ASCII 值 的 前 后 分 别 加"0", 如 是 西 文 字 符 是 小 写 字 母 则 转 换 为 大 写
加"1" 一 保 证 排 序 后 西 文 字 母 的 小 写 顺 序 值 总 是 紧 接 在 在 该 字 母 的 大 写 顺 序 值 之 后。
源 程 序 如 下: </td>
</tr></table><table width=100% ><tr><td class=a14>
//getorder.cpp ----取汉字顺序值的动态连接库</td></tr></table><table width=100% ><tr><td class=a14>
#include </td></tr></table><table width=100% ><tr><td class=a14>
#include </td></tr></table><table width=100% ><tr><td class=a14>
HANDLE hMapFile[2];</td></tr></table><table width=100% ><tr><td class=a14>
LPVOID pMapFile[2];</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
void ReleaseOpenedFile(int OpenedFileNum)</td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
UnmapViewOfFile(pMapFile[OpenedFileNum]);</td></tr></table><table width=100% ><tr><td class=a14>
CloseHandle(hMapFile[OpenedFileNum]);</td></tr></table><table width=100% ><tr><td class=a14>
}</td></tr></table><table width=100% ><tr><td class=a14>
BOOL WINAPI DllMain (HINSTANCE hDLL, </td></tr></table><table width=100% ><tr><td class=a14>
DWORD dwReason,LPVOID lpReserved)</td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
switch (dwReason) {</td></tr></table><table width=100% ><tr><td class=a14>
case DLL_PROCESS_ATTACH:</td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
DWORD dwMemoryStatus; </td></tr></table><table width=100% ><tr><td class=a14>
HANDLE hFile[2];</td></tr></table><table width=100% ><tr><td class=a14>
char buffer[MAX_PATH];</td></tr></table><table width=100% ><tr><td class=a14>
PSTR pszFileName[2]={"\\GBKPY.ORD",</td></tr></table><table width=100% ><tr><td class=a14>
"\\GBKBH.ORD"};</td></tr></table><table width=100% ><tr><td class=a14>
for (int j=0;j<=1;j++) { GetSystemDirectory (buffer, MAX_PATH); strcat(buffer,pszFileName[j]); if ((hFile[j]="CreateFile(buffer," GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL))="=" (HANDLE)-1) { MessageBox ( NULL, (LPCTSTR) "Fail in opening file", (LPCTSTR) "Error",MB_OK ); return FALSE; } if ((hMapFile[j]="CreateFileMapping(hFile[j]," NULL,PAGE_READONLY, 0, 0, NULL))="=" (HANDLE)-1) { MessageBox ( NULL, (LPCTSTR) "Fail in creating map file", (LPCTSTR) "Error",MB_OK ); CloseHandle(hFile[j]); for ( j--;j<0;j--) ReleaseOpenedFile(j); return FALSE; } CloseHandle(hFile[j]); dwMemoryStatus="GetLastError();" if ((pMapFile[j]="MapViewOfFile(hMapFile[j]," FILE_MAP_READ, 0, 0, 0))="=" NULL) { MessageBox ( NULL,(LPCTSTR) "Fail in mapping view of the Map File object", (LPCTSTR) "Error",MB_OK ); CloseHandle(hMapFile[j]); for (j--;j<0;j--) ReleaseOpenedFile(j); return FALSE; } if (dwMemoryStatus="=ERROR_ALREADY_EXISTS)" return FALSE; } return TRUE; } case DLL_PROCESS_DETACH: for (int i="1;i<0;i--)" ReleaseOpenedFile(i); break; } return TRUE; } char *strcati( char *strDestination, unsigned char cSource) { char cHaft; cHaft="(cSource&0xf0)">>4;</td></tr></table><table width=100% ><tr><td class=a14>
if (cHaft<=9) cHaft+="48;" else cHaft+="55;" //十六进制转换为其ASCII字符 strncat(strDestination,&cHaft,1); cHaft="cSource&0x0f;" if (cHaft<="9)" cHaft+="48;" else cHaft+="55;" strncat(strDestination,&cHaft,1); return strDestination; } CHAR * __stdcall GetOrderString ( char FAR *strSource,int OrderType) { if (OrderType!="0" && OrderType!="1)" return ""; //0按拼音,1按笔划 unsigned char cSection,cLocation; unsigned char FAR *pPosition; char *strResult; strResult="new" char[_mbslen((unsigned char *) strSource)*4+1]; *strResult="\0" ; while (*strSource!="NULL)" { if ((unsigned char)*strSource>=0x80)</td></tr></table><table width=100% ><tr><td class=a14>
{ //中文</td></tr></table><table width=100% ><tr><td class=a14>
cSection=(unsigned char)*strSource;</td></tr></table><table width=100% ><tr><td class=a14>
strSource++;</td></tr></table><table width=100% ><tr><td class=a14>
cLocation=(unsigned char)*strSource;</td></tr></table><table width=100% ><tr><td class=a14>
pPosition=(unsigned char FAR *)pMapFile[OrderType]+</td></tr></table><table width=100% ><tr><td class=a14>
((cSection-0x81)*191+cLocation-0x40)*2;</td></tr></table><table width=100% ><tr><td class=a14>
strcati(strResult,*(pPosition+1));</td></tr></table><table width=100% ><tr><td class=a14>
strcati(strResult,*pPosition);</td></tr></table><table width=100% ><tr><td class=a14>
}</td></tr></table><table width=100% ><tr><td class=a14>
else { //西文</td></tr></table><table width=100% ><tr><td class=a14>
strcat(strResult,"0");</td></tr></table><table width=100% ><tr><td class=a14>
if ((*strSource>=0x61)&&(*strSource<=0x7a)) { //如是小写字母,转换成大写,最后一字节置为"1" strcati(strResult,(unsigned char)*strSource-0x20); strcat(strResult,"1"); } else { //除小写的其他字母 strcati(strResult,(unsigned char)*strSource); strcat(strResult,"0"); } } strSource++; } return strResult; } //getorder.def LIBRARY GetOrder DESCRIPTION 'Get Chinese Order Key Feng Xu' CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD SINGLE EXPORTS GetOrderString @2 </td></tr></table><table width=100% ><tr>
<td class=a14> <b>五、 在 应 用 程 序 中 使 用DLL</b> ---- 我 们 在 编 译 建 立 动 态 连 接 库
后, 也 可 以 在 本 报 网 站 上 直 接 下 载。 将GETORDER.DLL 和 生 成 的 顺 序 值 文 件 全 部 拷 贝
入Windows 下 的System 目 录。 </td>
</tr></table><table width=100% ><tr><td class=a14>
---- 在VB 和Access 中 使 用 需 先 在 全 局 模 块 中 作 如 下 声 明: </td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
Declare Function GetOrderString</td></tr></table><table width=100% ><tr><td class=a14>
Lib "getorder" (ByVal str _</td></tr></table><table width=100% ><tr><td class=a14>
As String, ByVal nNUM As Long) As String</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
如在VF中使用也需要作类似声明。</td></tr></table><table width=100% ><tr><td class=a14>
DECLARE STRING GetOrderString IN GETORDER.DLL ;</td></tr></table><table width=100% ><tr><td class=a14>
AS GetOrderString STRING </td></tr></table><table width=100% ><tr><td class=a14>
strSource,INTEGER OrderType</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
之 后, 就 可 以 方 便 的 在 自 己 的 应 用 程 序 中 使 用GetOrderString 函 数, 通 过SQL 语 句 给 数 据 库 的 中 文 字 段 按 拼 音 或 笔 划 排 序。 </td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr>
<td class=a14> <b>六、 进 一 步 改 进 </b>---- 本 文 只 提 供 在Windows 95 下 的 解 决 办
法, 可 以 通 过 修 改 取 字 符 串 顺 序 值 函 数 让 其 在Win 3.x 和DOS 下 使 用。 </td>
</tr></table><table width=100% ><tr><td class=a14>
最 后 需 要 特 别 注 意 的 是 微 软 的 汉 字 的 笔 画 数 排 序 和 我 们 一 般 所 说 的 笔 划 排 序 是 有 区 别 的, 微 软 的 汉 字 的 笔 画 数 排 序 是 先 按 笔 画 数 排, 同 笔 画 数 再 按 该 字 的UNICODE 的 码 点 值 排 序, 真 正 的 汉 字 笔 划 排 序 是 先 按 笔 划 数 排 序, 同 笔 划 数 再 按" 一 丨 丿 丶乛" 先 后 的 笔 顺 排 序。 所 以 要 彻 底 解 决 笔 划 排 序 问 题, 需 要 在 上 述 的 生 成 顺 序 值 文 件 时, 手 工 根 据《 汉 字 标 准 字 典》 在Execl 97 中 建 一 笔 顺 库, 然 后 按" 笔 划 数+ 笔 顺" 排 序 后 存 成GBKBH.TXT。 </td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr>
</table><br>
<style>.a1{font-size:1}</style>
<table width=100% ><tr><td align=right>(网页编辑:<a href='mailto:liu_yang@ccw.com.cn'>风之翼</a>)</td></tr></table>
</td><td class=a1 bgcolor=#f46240> </td>
<td valign=top width=138 align=right><table width=98% ><tr><td>
<form action='/app/gsearch1.asp' name=pdn><table width=100% ><tr><td>应用与方案
频道全文检索</td></tr>
<tr><td><input type="text" name="textfile" size=15 value=频道内检索 onfocus="this.value=''">
<input border=0 src="../../../../../images/jian.gif" name="I1" type="image" align=absmiddle>
</td></tr>
</table>
</form>
<form name=srch action="/search/which.asp" method=post onsubmit="JavaScript:return chk()">
<table width=100% >
<tr><td><select size="1" name="func">
<option selected value="2">主题检索</option>
<option value="1">周报全文检索</option>
<option value="3">模糊词检索</option>
</select></td></tr>
<tr><td><input type="text" name="SrchStr" size=15 value="输入待检索的词"
onfocus="this.value=''">
<input src="../../../../../images/jian.gif" name="I1" type="image" align="absMiddle" border=0>
</td></tr>
</table>
<script language="JavaScript">
function chk()
{if (!document.srch.SrchStr.value){
alert("请输入需检索的词!");
document.srch.SrchStr.focus();
return false;
}
else{if (document.srch.SrchStr.value.length>30){
alert("检索的词请不要超过30个字符!");
document.srch.SrchStr.focus();
return false;
}
}
}
</script></form>
<table width=100% ><tr><td class=f colspan=2><b>相关文章</b></td></tr>
<tr><td valign=top><IMG SRC=../../../../../img2/jiao.gif></td><td><a href='../neimu/01_9_17_31.asp.html'>4.2 高级调试技术</a></td></tr>
<tr><td valign=top><IMG SRC=../../../../../img2/jiao.gif></td><td><a href='01_9_17_14.asp.html'>纯资源DLL的编写</a></td></tr>
<tr><td valign=top><IMG SRC=../../../../../img2/jiao.gif></td><td><a href='01_9_17_13.asp.html'>Windows下DLL编程技术及应用</a></td></tr>
<tr><td valign=top><IMG SRC=../../../../../img2/jiao.gif></td><td><a href='01_9_17_12.asp.html'>用VC++5.0定制和调用动态链接库</a></td></tr>
<tr><td valign=top><IMG SRC=../../../../../img2/jiao.gif></td><td><a href='../neimu/01_9_17_30.asp.html'>4.1.5 查看工具的使用</a></td></tr>
</table>
</td></tr></table></td></tr></table><br>
<table align=center width=680><tr><td align=right>
<form name=mail method=post action='/pub/subMail.asp' onsubmit='JavaScript: return chkField(this)'>
<INPUT type='hidden' name='rec' value='24345'>
您的姓名:<INPUT type="text" name=myName size=10>
您朋友的E-mail:<INPUT type="text" name=friendMail size=10>
<INPUT type="submit" value="推荐给好友">
</form>
</td></tr>
<tr><td align=right>
<b>[<a href="javascript:window.close()">关闭窗口</a>]</b>
</td></tr>
</table>
<script language="javascript">
function chkField(fmObj)
{if (!fmObj.friendMail.value){
alert("请输入您朋友的E-mail!");
fmObj.friendMail.focus();
return false;
}
return true;
}
</script>
<table align=center width=680>
<tr><td><hr size=1 width=660 color=#f46240></td></tr>
</table><br>
<p align=center>Copyright(C) ccw.com.cn,All rights reserved</p>
<p align=center><b>中国计算机世界出版服务公司版权所有</b></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -