最新更新 sitemap 网站制作设计本站搜索
网页设计
国外网站 韩国网站 个人主页 手提袋设计 CSS 网页特效 平面设计 网站设计 Flash CMS技巧 服装网站 php教程 photoshop 画册 服务器选用 数据库 Office
虚拟主机 域名注册 云主机 网页设计 客服QQ:8208442
当前位置:首页 > 编程开发 > VB开发

在VB应用程序中巧用DLL

日期:10-17    来源:中国设计秀    作者:cnwebshow.com

在使用VB开发多媒体应用程序时,如何合理地存放大量的多媒体资源,是一件十分棘手的事。如果将资源以文件形式存放在磁(光)盘上,使用时再从盘上读取,势必大大影响资源调用的速度。如果将资源直接编译在应用程序的可执行文件中,虽然可以获得令人满意的资源存取速度,但会导致最终的可执行文件尺寸大大膨胀。如何解决这个矛盾呢?笔者从Windows动态链接库的原理中得到启发,找到了一个结合二者优势的解决方法。 8Pk中国设计秀
动态链接库是实现Windows应用程序共享资源、节省内存空间、提高使用效率的一个重要技术手段。常见的动态库包含外部函数和资源,也有一些动态库只包含资源,如Windows字体资源文件,我们将这类动态库称之为资源动态链接库。制作资源动态库的方法很多,笔者在此提供了一种无需编程、简单有效的方法。该方法利用了Borland C++的资源管理器Resource Workshop的反编译能力,借用现成的动态库,将其改制为自己的资源动态库。具体方法是,拷贝一个现成的资源动态库文件(如windowssystem目录下的字体资源文件arial.fot)到应用程序工作目录,更改文件名,如改为DEMO.DLL。然后在Resource Workshop中打开该文件,选择其中原有的资源将其删除,再加入自己的资源,即可制成自己的资源动态库。由于篇幅所限,具体操作过程请读者参阅有关资料。不过有两个关键问题需要提请读者注意,其一,对于声音这类非Windows传统资源,在加入动态库之前,需要用户自定义一个资源类型以存放这类资源,如笔者在DEMO.DLL中为Windows音频文件定义了WAVE资源类型;其二,动态库中每一个资源的资源名十分重要,它是调用资源的关键,建议用户最好在加入资源后为其定义一个有意义的资源名。 8Pk中国设计秀
通过上面介绍的资源动态库的简单制作方法,即使不熟悉C语言的读者也可以轻松地制作自己的资源动态库了。现在,让我们来看看如何在VB多媒体应用程序中调用资源动态库中的资源。VB本身并没有调用动态库的函数和语句,因此必须借助于Windows API函数。下面笔者将结合一个实例,具体介绍调用方法。实例中使用的是笔者通过上述方法制作的资源动态库DEMO.DLL,其中包含两个BITMAP(.bmp)类型资源B1和B2,两个WAVE(.wav)类型资源S1和S2。 8Pk中国设计秀
首先,新建一个VB工程,其中包含一个窗体Form1和一个模块Module1。在窗体Form1中加入了一个图片框控件Picture1和四个命令按钮控件,Picture1用于显示动态库中的位图资源,四个命令按钮的属性设置和功能含义如下表: 8Pk中国设计秀
属性 功能 8Pk中国设计秀
Name Index Caption 8Pk中国设计秀
cmdBitmap 0 BitmapA 在Picture1中显示DEMO.DLL中资源名为B1的位图资源 8Pk中国设计秀
cmdBitmap 1 BitmapB 在Picture1中显示DEMO.DLL中资源名为B2的位图资源 8Pk中国设计秀
cmdSound 0 SoundA 播放DEMO.DLL中资源名为S1的声音资源 8Pk中国设计秀
cmdSound 1 SoundB 播放DEMO.DLL中资源名为S2的声音资源 8Pk中国设计秀
接着在Module1和Form1中加入下列代码,便可完成实例程序: 8Pk中国设计秀
※Moudle1.bas清单 8Pk中国设计秀
'声明API函数 8Pk中国设计秀
Declare Function LoadLibrary% Lib "Kernel" (ByVal lpLibFileName$) 8Pk中国设计秀
Declare Sub FreeLibrary Lib "Kernel" (ByVal hLibModule%) 8Pk中国设计秀
Declare Function LoadBitmap% Lib "User" (ByVal hInstance%, ByVal lpBitmapName As Any) 8Pk中国设计秀
Declare Function GetObj% Lib "GDI" Alias "GetObject" (ByVal hObject%, ByVal nCount%, lpObject As Any) 8Pk中国设计秀
Declare Function CreateCompatibleDC% Lib "GDI" (ByVal hDC%) 8Pk中国设计秀
Declare Function SelectObject% Lib "GDI" (ByVal hDC%, ByVal hObject%) 8Pk中国设计秀
Declare Function BitBlt% Lib "GDI" (ByVal hDestDC%, ByVal x%, ByVal y%, ByVal nWidth%, ByVal nHeight%, ByVal hSrcDC%, ByVal XSrc%, ByVal YSrc%, ByVal dwRop&) 8Pk中国设计秀
Declare Function DeleteDC% Lib "GDI" (ByVal hDC%) 8Pk中国设计秀
Declare Function DeleteObject% Lib "GDI" (ByVal hObject%) 8Pk中国设计秀
Declare Function FindResource% Lib "Kernel" (ByVal hInstance%, ByVal lpName$, ByVal lpType As Any) 8Pk中国设计秀
Declare Function LockResource& Lib "Kernel" (ByVal hResData%) 8Pk中国设计秀
Declare Function LoadResource% Lib "Kernel" (ByVal hInstance%, ByVal hResInfo%) 8Pk中国设计秀
Declare Function GlobalUnlock% Lib "Kernel" (ByVal hMem%) 8Pk中国设计秀
Declare Function sndPlaySound% Lib "MMSYSTEM" (ByVal lpszSoundName As Any, ByVal uFlags%) 8Pk中国设计秀
'位图数据结构类型 8Pk中国设计秀
Type BITMAP 8Pk中国设计秀
bmType As Integer 8Pk中国设计秀
bmWidth As Integer 8Pk中国设计秀
bmHeight As Integer 8Pk中国设计秀
bmWidthBytes As Integer 8Pk中国设计秀
bmPlanes As String * 1 8Pk中国设计秀
bmBitsPixel As String * 1 8Pk中国设计秀
bmBits As Long 8Pk中国设计秀
End Type 8Pk中国设计秀
'光栅操作代码常量 8Pk中国设计秀
Public Const SRCCOPY = &HCC0020 8Pk中国设计秀
'声音播放状态常量 8Pk中国设计秀
Public Const SND_SYNC = &H0 8Pk中国设计秀
Public Const SND_MEMORY = &H4 8Pk中国设计秀
'调用位图资源子例程 8Pk中国设计秀
Sub load_pic(picName As String) 8Pk中国设计秀
Dim hDLL As Integer 8Pk中国设计秀
Dim hdcMemory, hLoadedbitmap, hOldBitmap As Integer 8Pk中国设计秀
Dim retVal As Integer 8Pk中国设计秀
Dim bmpInfo As BITMAP 8Pk中国设计秀
'安装动态链接库DEMO.DLL 8Pk中国设计秀
hDLL = LoadLibrary(App.Path & "DEMO.DLL") 8Pk中国设计秀
'根据资源名从动态链接库中加载相应的位图资源 8Pk中国设计秀
hLoadedbitmap = LoadBitmap(hDLL, picName) 8Pk中国设计秀
'获取位图信息 8Pk中国设计秀
retVal = GetObj(hLoadedbitmap, Len(bmpInfo), bmpInfo) 8Pk中国设计秀
'创建一个与图片框控件的设备描述表兼容的内存设备描述表 8Pk中国设计秀
hdcMemory = CreateCompatibleDC(Form1.Picture1.hDC) 8Pk中国设计秀
'将位图选入内存设备描述表 8Pk中国设计秀
hOldBitmap = SelectObject(hdcMemory, hLoadedbitmap) 8Pk中国设计秀
'将位图从内存设备描述表中拷入图片框控件的设备描述表中 8Pk中国设计秀
retVal = BitBlt(Form1.Picture1.hDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, hdcMemory, 0, 0, SRCCOPY) 8Pk中国设计秀
'将原始位图选入内存设备描述表 8Pk中国设计秀
retVal = SelectObject(hdcMemory, hOldBitmap) 8Pk中国设计秀
'删除加载的位图,释放其占用的所有系统资源 8Pk中国设计秀
retVal = DeleteObject(hLoadedbitmap) 8Pk中国设计秀
'删除内存设备描述表 8Pk中国设计秀
retVal = DeleteDC(hdcMemory) 8Pk中国设计秀
'释放动态链接库 8Pk中国设计秀
FreeLibrary (hDLL) 8Pk中国设计秀
End Sub 8Pk中国设计秀
'调用声音资源子例程 8Pk中国设计秀
Sub load_sound(wavName As String) 8Pk中国设计秀
Dim hDLL As Integer 8Pk中国设计秀
Dim hloadwave As Integer 8Pk中国设计秀
Dim hwaveres As Integer 8Pk中国设计秀
Dim hsound As Long 8Pk中国设计秀
Dim hrelease As Integer 8Pk中国设计秀
Dim resVal As Integer 8Pk中国设计秀
hDLL = LoadLibrary(App.Path & "DEMO.DLL") 8Pk中国设计秀
'在动态链接库中查找资源类型为WAVE,资源名为wavName的资源 8Pk中国设计秀
hwaveres = FindResource(hDLL, wavName, "WAVE") 8Pk中国设计秀
'将该资源装入内存 8Pk中国设计秀
hloadwave = LoadResource(hDLL, hwaveres) 8Pk中国设计秀
'锁定该资源 8Pk中国设计秀
hsound = LockResource(hloadwave) 8Pk中国设计秀
'以同步方式播放内存中的声音资源 8Pk中国设计秀
resVal = sndPlaySound(hsound, SND_SYNC + SND_MEMORY) 8Pk中国设计秀
'释放该资源占用的内存 8Pk中国设计秀
hrelease = GlobalUnlock(hloadwave) 8Pk中国设计秀
FreeLibrary (hDLL) 8Pk中国设计秀
End Sub 8Pk中国设计秀
8Pk中国设计秀
※FORM1.FRM代码清单 8Pk中国设计秀
Private Sub cmdBitmap_Click(Index As Integer) 8Pk中国设计秀
Picture1.Picture = LoadPicture("") '清空图片框控件 8Pk中国设计秀
Select Case Index 8Pk中国设计秀
Case 0 8Pk中国设计秀
load_pic ("B1") 8Pk中国设计秀
Case 1 8Pk中国设计秀
load_pic ("B2") 8Pk中国设计秀
End Select 8Pk中国设计秀
End Sub 8Pk中国设计秀
Private Sub cmdSound_Click(Index As Integer) 8Pk中国设计秀
Select Case Index 8Pk中国设计秀
Case 0 8Pk中国设计秀
load_sound ("S1") 8Pk中国设计秀
Case 1 8Pk中国设计秀
load_sound ("S2") 8Pk中国设计秀
End Select 8Pk中国设计秀
End Sub8Pk中国设计秀

 8Pk中国设计秀

本文引用地址:/bc/article_61287.html
网站地图 | 关于我们 | 联系我们 | 网站建设 | 广告服务 | 版权声明 | 免责声明