• 全部
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

做个DLL给VB调用,要注意什么?

cenpy 2002-05-08 11:11:29
我要用C++做个DLL给VB调用,请问呀注意些什么呢!?
我只知道C++的调用DLL的方法,但是VB的又是怎样,怎样做才能让VB调用得更好呢!?

望各位高手指点指点!
...全文
85 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
feifei2001 2002-05-09
在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
cmdBitmap 0 BitmapA 在Picture1中显示DEMO.DLL中资源名为B1的位图资源
cmdBitmap 1 BitmapB 在Picture1中显示DEMO.DLL中资源名为B2的位图资源
cmdSound 0 SoundA 播放DEMO.DLL中资源名为S1的声音资源
cmdSound 1 SoundB 播放DEMO.DLL中资源名为S2的声音资源
接着在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 98 环境下通过测试。程序中的某些参数设置与特定需求(如资源动态库的内容等)有关,读者在开发实际应用时应做相应的改动。
回复
mjk 2002-05-09
VC作的DLL分为两种类型,一种供自己用,一种供其他程序调用,请查相关说明
回复
wiler 2002-05-09
你的email?
我发给你例子
回复
alex_fan 2002-05-09
要注意用的时候在别的机器上要先注册哦,用regsvr32 (我以前犯过的错误),呵呵
回复
cenpy 2002-05-09
cenpy@21cn.com

谢谢!
:)
回复
huqiming 2002-05-09
win32 dll

extern "C"

回复
cenpy 2002-05-08
要用非MFC的DLL
怎样做?!
回复
Hover 2002-05-08
要用ATL做个COM DLL,要从IDispatch派生,参数中字串应为BSTR
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2002-05-08 11:11
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……