现在是一个社会大分工的时代,需要专业人才,不欢迎“万金油”。DLL的出现正顺应了这个潮流,一部分人专门写函数,一部分人做程序。让我们写一个DLL感受一下。
什么,你已经把VB打开了,VB能写DLL吗?ActiveX DLL并不是API DLL,别上当!关了VB吧,今天的主角是Borland C++!
看过VB的查找文件例题吗?为什么VB只能按名称查找,不能查找“包含文字”呢?如果你实际做一下就会发现,VB太慢了,不适合搞文件读写。算了,用C++做一个DLL吧!
DLL中有许多特殊的地方,不过有英明的编译器撑腰,我们不用管这些细节。DLL的源代码结构是这样的:
//DLL头,如果没有特殊要求,这几行是固定的,建议单独写进一个文件
BOOL WINAPI DllEntryPoint(HINSTANCE,DWORD,LPVOID)
{
return true;
}
//在其它地方你可以自由地写任何函数
//格式:__declspec(dllexport) <返回值类型> WINAPI <函数名>[(参数)]
总的说来,写DLL是很自由的。我们把包含文字功能写进DLL中吧。别忘了把前面介绍的DllEntryPoint添加进去哟,不然运行不起来别说我是骗小孩!
#include <windows.h>
#include <stdio.h>
__declspec(dllexport) BOOL WINAPI isInclude(char *filename,char *string)
{
if(!filename)return false;
FILE *check;
if((check=fopen(filename,"r"))==NULL)
return false;
if(!string)return true;
long len=strlen(string);
//双缓冲查找!有趣不?
char *buffer=new char[len*2];
char *inputbuf=new char[len];
if(fgets(buffer,len+1,check)==NULL)
{
fclose(check);
return false;
}
while(!feof(check))
{
fgets(inputbuf,len+1,check);
strcat(buffer,inputbuf);
if(strstr(buffer,string))
{
fclose(check);
return true;
}
memcpy(buffer,inputbuf,len+1);
}
fclose(check);
return false;
}
写完了,编译好,下面该收获了。打开VB吧!
先Declare。开一个模块:
Declare Function isInclude Lib "schtxt.dll" Alias "@isInclude$qqspct1" (ByVal filename As String, ByVal text As String) As Boolean
上面的Lib是我们编译出的Dll,如果你不用这个名字,记得要改过来哟!至于Alias后面那一串乱七八糟的东西是函数的入口点,使用Windows配备的快速查看可得到这串东西。我要骂Borland了,都是它的错!把我的Dll函数入口点弄得一塌糊涂。为什么不直接用函数名作入口点呢?
建一个窗体。
为TxtFile和TxtText的Change事件编写代码:
Private Sub TxtFile_Change()
Check
End Sub
Private Sub TxtText_Change()
Check
End Sub
Private Sub Check()
If isInclude(TxtFile.text, TxtText.text) Then
LbInc.Caption = "包含"
Else
LbInc.Caption = "不包含"
End If
End Sub
运行一下,在TxtFile中填入一个文件名,在TxtText中填上一段文字。看看下面的LbInc,这段文字包含在文件中吗?
现在我们有万分把握写出新的查找程序了!不过不用指望它的速度能赶上Windows,Windows的查找是开过后门的。
下载Dll示例吧!我把微软的查找例题也放了进去,Dll部分版权所有,但查找例题版权不属于我哟!^_^