您好,欢迎来到华佗健康网。
搜索
您的当前位置:首页在VB应用程序中巧用DLL

在VB应用程序中巧用DLL

来源:华佗健康网
在VB应用程序中巧用DLL

在使用VB开发多媒体应用程序时,如何合理地存放大量的多媒体资源,是一件十分棘手的事。如果将资源以文件形式存放在磁(光)盘上,使用时再从盘上读取,势必大大影响资源调用的速度。如果将资源直接编译在应用程序的可执行文件中,虽然可以获得令人满意的资源存取速度,但会导致最终的可执行文件尺寸大大膨胀。如何解决这个矛盾呢?笔者从Windows动态链接库的原理中得到启发,找到了一个结合二者优势的解决方法。

动态链接库是实现Windows应用程序共享资源、节省内存空间、提高使用效率的一个重要技术手段。常见的动态库包含外部函数和资源,也有一些动态库只包含资源,如Windows字体资源文件,我们将这类动态库称之为资源动态链接库。制作资源动态库的方法很多,笔者在此提供了一种无需编程、简单有效的方法。该方法利用了Borland C++的资源管理器Resource Workshop的反编译能力,借用现成的动态库,将其改制为自己的资源动态库。具体方法是,拷贝一个现成的资源动态库文件(如windows\\system目录下的字体资源文件arial.fot)到应用程序工作目录,更改文件名,如改为DEMO.DLL。然后在Resource Workshop中打开该文件,选择其中原有的资源将其删除,再加入自己的资源,即可制成自己的资源动态库。由于篇幅所限,具体操作过程请读者参阅有关资料。不过有两个关键问题需要提请读者注意,其一,对于声音这类非Windows传统资源,在加入动态库之前,需要用户自定义一个资源类型以存放这类资源,如笔者在DEMO.DLL中为Windows音频文件定义了WAVE资源类型;其二,动态库中每一个资源的资源名十分重要,它是调用资源的关键,建议用户最好在加入资源后为其定义一个有意义的资源名。

通过上面介绍的资源动态库的简单制作方法,即使不熟悉C语言的读者也可以轻松地制作自己的资源动态库了。现在,让我们来看看如何在VB多媒体应用程序中调用资源动态库中的资源。VB本身并没有调用动态库的函数和语句,因此

必须借助于Windows API函数。下面笔者将结合一个实例,具体介绍调用方法。实例中使用的是笔者通过上述方法制作的资源动态库DEMO.DLL,其中包含两个BITMAP(.bmp)类型资源B1和B2,两个WAVE(.wav)类型资源S1和S2。 首先,新建一个VB工程,其中包含一个窗体Form1和一个模块Module1。在窗体Form1中加入了一个图片框控件Picture1和四个命令按钮控件,Picture1用于显示动态库中的位图资源,四个命令按钮的属性设置和功能含义如下表: 属性 功能 Name Index Caption cmdBi0 BitmapA 在Picture1中显示DEMO.DLL中资tmap 源名为B1的位图资源 cmdBi1 BitmapB 在Picture1中显示DEMO.DLL中资tmap 源名为B2的位图资源 cmdSo0 SoundA 播放DEMO.DLL中资源名为S1的und 声音资源 cmdSo1 SoundB 播放DEMO.DLL中资源名为S2的und 声音资源 接着在Module1和Form1中加入下列代码,便可完成实例程序:

※Moudle1.bas清单 '声明API函数

Declare Function LoadLibrary% Lib \"Kernel\" (ByVal lpLibFileName$)

Declare Sub FreeLibrary Lib \"Kernel\" (ByVal hLibModule%)

Declare Function LoadBitmap% Lib \"User\" (ByVal hInstance%, ByVal lpBitmapName As Any)

Declare Function GetObj% Lib \"GDI\" Alias \"GetObject\" (ByVal hObject%, ByVal nCount%, lpObject As Any)

Declare Function CreateCompatibleDC% Lib \"GDI\" (ByVal hDC%)

Declare Function SelectObject% Lib \"GDI\" (ByVal hDC%, ByVal hObject%)

Declare Function BitBlt% Lib \"GDI\" (ByVal hDestDC%, ByVal x%, ByVal y%, ByVal nWidth%, ByVal nHeight%, ByVal hSrcDC%, ByVal XSrc%, ByVal YSrc%, ByVal dwRop&)

Declare Function DeleteDC% Lib \"GDI\" (ByVal hDC%) Declare Function DeleteObject% Lib \"GDI\" (ByVal hObject%)

Declare Function FindResource% Lib \"Kernel\" (ByVal hInstance%, ByVal lpName$, ByVal lpType As Any) Declare Function LockResource& Lib \"Kernel\" (ByVal hResData%)

Declare Function LoadResource% Lib \"Kernel\" (ByVal hInstance%, ByVal hResInfo%)

Declare Function GlobalUnlock% Lib \"Kernel\" (ByVal hMem%)

Declare Function sndPlaySound% Lib \"MMSYSTEM\" (ByVal lpszSoundName As Any, ByVal uFlags%) '位图数据结构类型 Type BITMAP

bmType As Integer bmWidth As Integer bmHeight As Integer

bmWidthBytes As Integer bmPlanes As String * 1 bmBitsPixel As String * 1 bmBits As Long End Type

'光栅操作代码常量

Public Const SRCCOPY = &HCC0020 '声音播放状态常量

Public Const SND_SYNC = &H0 Public Const SND_MEMORY = &H4 '调用位图资源子例程

Sub load_pic(picName As String) Dim hDLL As Integer

Dim hdcMemory, hLoadedbitmap, hOldBitmap As Integer Dim retVal As Integer

Dim bmpInfo As BITMAP '安装动态链接库DEMO.DLL

hDLL = LoadLibrary(App.Path & \"\\DEMO.DLL\") '根据资源名从动态链接库中加载相应的位图资源 hLoadedbitmap = LoadBitmap(hDLL, picName) '获取位图信息

retVal = GetObj(hLoadedbitmap, Len(bmpInfo), bmpInfo)

'创建一个与图片框控件的设备描述表兼容的内存设备描述表

hdcMemory =

CreateCompatibleDC(Form1.Picture1.hDC) '将位图选入内存设备描述表

hOldBitmap = SelectObject(hdcMemory, hLoadedbitmap)

'将位图从内存设备描述表中拷入图片框控件的设备描述表中

retVal = BitBlt(Form1.Picture1.hDC, 0, 0,

bmpInfo.bmWidth, bmpInfo.bmHeight, hdcMemory, 0, 0, SRCCOPY)

'将原始位图选入内存设备描述表

retVal = SelectObject(hdcMemory, hOldBitmap) '删除加载的位图,释放其占用的所有系统资源 retVal = DeleteObject(hLoadedbitmap) '删除内存设备描述表

retVal = DeleteDC(hdcMemory) '释放动态链接库

FreeLibrary (hDLL) End Sub

'调用声音资源子例程

Sub load_sound(wavName As String) Dim hDLL As Integer

Dim hloadwave As Integer Dim hwaveres As Integer Dim hsound As Long Dim hrelease As Integer

Dim resVal As Integer

hDLL = LoadLibrary(App.Path & \"\\DEMO.DLL\") '在动态链接库中查找资源类型为WAVE,资源名为wavName的资源

hwaveres = FindResource(hDLL, wavName, \"WAVE\") '将该资源装入内存

hloadwave = LoadResource(hDLL, hwaveres) '锁定该资源

hsound = LockResource(hloadwave) '以同步方式播放内存中的声音资源

resVal = sndPlaySound(hsound, SND_SYNC + SND_MEMORY)

'释放该资源占用的内存

hrelease = GlobalUnlock(hloadwave) FreeLibrary (hDLL) End Sub

※FORM1.FRM代码清单

Private Sub cmdBitmap_Click(Index As Integer)

Picture1.Picture = LoadPicture(\"\") '清空图片框控件 Select Case Index Case 0

load_pic (\"B1\") Case 1

load_pic (\"B2\") End Select End Sub

Private Sub cmdSound_Click(Index As Integer) Select Case Index Case 0

load_sound (\"S1\") Case 1

load_sound (\"S2\") End Select End Sub

本实例程序已在Windows 3.X环境下通过测试。程序中的

某些参数设置与特定需求(如资源动态库的内容等)有关,读者在开发实际应用时应做相应的改动。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.com 版权所有 湘ICP备2023021991号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务