在DLL中定义一个函数,如 extern "C" __declspec(dllexport) HBITMAP WINAPI LoadBitmapFromResource(long nResourceID);HBITMAP WIANPI LoadBitmapFromResource(long nResourceID){ return LoadBitmap(theApp.m_hInstance,MAKEINTRESOURCE(nID)); }在VB中定义 Public Declare Function LoadBitmapFromResource Lib "dll_name.dll" (ByVal nResourceID As Long) As Long这样,通过调用该函数,就可以生成一个 HBITMAP 对象 可以在vb中使用需要注意的是: 1.dll用mfc dll,这样,你才可以方便的取得 instance handle, 即 theApp.m_hInstance 2.函数需要导出,在.Def中导出 EXPORTS LoadBitmapFromResource 3.在vb中传递的 nResourceID即为DLL中 Resource.H中定义的 Resource id 4.vb程序中记得调用 API DeleteObject释放 HBITMAP 对象
又想了一下,可以在vb中直接调用LoadBitmap, 代码如下:API 声明Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As LongPublic Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long'Public Declare Function LoadBitmap Lib "user32" Alias "LoadBitmapA" '(ByVal hInstance As Long, ByVal lpBitmapName As String) As LongPublic Declare Function LoadBitmap Lib "user32" Alias "LoadBitmapA" (ByVal hInstance As Long, ByVal lpBitmapName As Long) As LongPublic Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '注意上面的函数申明,LoadBitmapA的第二个参数原本是 String 类型 '也就是注释掉的那一句,为了能传资源 ID, '将第二个参数的类型该为 Long. '因为VB中不能将一个整数转换成一个字符传指针,但事实上,指针就是一个 'unsigned long,所以,将String 替换成 Long 是不会出错的.但你如果还 '需要直接从BMP文件Load,那就需要另外申明一个String做参数的函数 ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''载入位图函数定义: Public Function LoadBitmapFromDll(ByVal nResourceID As Long) As Long Dim hModule As Long
LoadBitmapFromDll = 0
hModule = LoadLibrary("dll file name") If hModule = 0 Then Exit Function End If
vb的调用代码,以调用CARDS.DLL里编号为1的位图为例:Option ExplicitPrivate Type PictDesc cbSizeofStruct As Long picType As Long hImage As Long xExt As Long yExt As Long End TypePrivate Type Guid Data1 As Long Data2 As Integer Data3 As Integer Data4(0 To 7) As Byte End TypePrivate Declare Function OleCreatePictureIndirect Lib "olepro32.dll" ( _ lpPictDesc As PictDesc, _ riid As Guid, _ ByVal fPictureOwnsHandle As Long, _ ipic As IPicture _ ) As Long Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" _ (ByVal lpLibFileName As String) As Long Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule _ As Long) As Long Private Declare Function LoadImage Lib "user32" Alias "LoadImageA" _ (ByVal hInst As Long, ByVal lpsz As String, _ ByVal iType As Long, _ ByVal cx As Long, ByVal cy As Long, _ ByVal fOptions As Long) As LongPrivate Const IMAGE_BITMAP = 0 Private Const IMAGE_ICON = 1 Private Const IMAGE_CURSOR = 2Private Const LR_LOADMAP3DCOLORS = &H1000 Private Const LR_LOADFROMFILE = &H10 Private Const LR_LOADTRANSPARENT = &H20 Private Sub Command1_Click() Dim hModule As Long, hBitmap As Long hModule = LoadLibrary("CARDS.DLL") hBitmap = LoadImage(hModule, "#1", 0, 0, 0, LR_LOADMAP3DCOLORS) Set Picture1.Picture = BitmapToPicture(hBitmap) FreeLibrary hModule End Sub Public Function BitmapToPicture(ByVal hBmp As Long) As IPicture If (hBmp = 0) Then Exit Function Dim NewPic As Picture, tPicConv As PictDesc, IGuid As Guid With tPicConv .cbSizeofStruct = Len(tPicConv) .picType = vbPicTypeBitmap .hImage = hBmp End With With IGuid .Data1 = &H20400 .Data4(0) = &HC0 .Data4(7) = &H46 End With OleCreatePictureIndirect tPicConv, IGuid, True, NewPic Set BitmapToPicture = NewPic End Function
外部程序调用的话,用LoadResource, LockResource
{
HRSRC hRes = FindResource(hModule, pResName, RT_BITMAP); if ( hRes==NULL )
return NULL; HGLOBAL hGlb = LoadResource(hModule, hRes); if ( hGlb==NULL )
return NULL; return (BITMAPINFO *) LockResource(hGlb);
}
你先LoadLibrary,把dll load近来
extern "C" __declspec(dllexport) HBITMAP WINAPI
LoadBitmapFromResource(long nResourceID);HBITMAP WIANPI LoadBitmapFromResource(long nResourceID){
return LoadBitmap(theApp.m_hInstance,MAKEINTRESOURCE(nID));
}在VB中定义
Public Declare Function LoadBitmapFromResource Lib "dll_name.dll"
(ByVal nResourceID As Long) As Long这样,通过调用该函数,就可以生成一个 HBITMAP 对象
可以在vb中使用需要注意的是:
1.dll用mfc dll,这样,你才可以方便的取得 instance handle,
即 theApp.m_hInstance
2.函数需要导出,在.Def中导出
EXPORTS
LoadBitmapFromResource
3.在vb中传递的 nResourceID即为DLL中 Resource.H中定义的 Resource id
4.vb程序中记得调用 API DeleteObject释放 HBITMAP 对象
代码如下:API 声明Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA"
(ByVal lpLibFileName As String) As LongPublic Declare Function FreeLibrary Lib "kernel32"
(ByVal hLibModule As Long) As Long'Public Declare Function LoadBitmap Lib "user32" Alias "LoadBitmapA"
'(ByVal hInstance As Long, ByVal lpBitmapName As String) As LongPublic Declare Function LoadBitmap Lib "user32" Alias "LoadBitmapA"
(ByVal hInstance As Long, ByVal lpBitmapName As Long) As LongPublic Declare Function DeleteObject Lib "gdi32"
(ByVal hObject As Long) As Long''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'注意上面的函数申明,LoadBitmapA的第二个参数原本是 String 类型
'也就是注释掉的那一句,为了能传资源 ID,
'将第二个参数的类型该为 Long.
'因为VB中不能将一个整数转换成一个字符传指针,但事实上,指针就是一个
'unsigned long,所以,将String 替换成 Long 是不会出错的.但你如果还
'需要直接从BMP文件Load,那就需要另外申明一个String做参数的函数
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''载入位图函数定义:
Public Function LoadBitmapFromDll(ByVal nResourceID As Long) As Long
Dim hModule As Long
LoadBitmapFromDll = 0
hModule = LoadLibrary("dll file name")
If hModule = 0 Then
Exit Function
End If
LoadBitmapFromDll = LoadBitmap(hModule, nResourceID)
FreeLibrary hModule
End Function当然,资源ID仍然是你在 DLL 的 Resource.H 中定义的资源ID
LoadBitmapFromDll 这个函数调用成攻返回一个大于0的整 数,,失败返回0 是不是
不知道什么
什么把图片指定给一个Pictuerbox OR Image
xlt123(杀了你好吗) 他的方法好像是可以的,,,只是LoadBitmapFromDll 返回的好像
是图片的句柄(也不知道叫对了没有),,Picture1.Picture = LoadBitmapFromDll (101)
会提示"类型不匹配"
cbSizeofStruct As Long
picType As Long
hImage As Long
xExt As Long
yExt As Long
End TypePrivate Type Guid
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End TypePrivate Declare Function OleCreatePictureIndirect Lib "olepro32.dll" ( _
lpPictDesc As PictDesc, _
riid As Guid, _
ByVal fPictureOwnsHandle As Long, _
ipic As IPicture _
) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" _
(ByVal lpLibFileName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule _
As Long) As Long
Private Declare Function LoadImage Lib "user32" Alias "LoadImageA" _
(ByVal hInst As Long, ByVal lpsz As String, _
ByVal iType As Long, _
ByVal cx As Long, ByVal cy As Long, _
ByVal fOptions As Long) As LongPrivate Const IMAGE_BITMAP = 0
Private Const IMAGE_ICON = 1
Private Const IMAGE_CURSOR = 2Private Const LR_LOADMAP3DCOLORS = &H1000
Private Const LR_LOADFROMFILE = &H10
Private Const LR_LOADTRANSPARENT = &H20
Private Sub Command1_Click()
Dim hModule As Long, hBitmap As Long
hModule = LoadLibrary("CARDS.DLL")
hBitmap = LoadImage(hModule, "#1", 0, 0, 0, LR_LOADMAP3DCOLORS)
Set Picture1.Picture = BitmapToPicture(hBitmap)
FreeLibrary hModule
End Sub
Public Function BitmapToPicture(ByVal hBmp As Long) As IPicture
If (hBmp = 0) Then Exit Function
Dim NewPic As Picture, tPicConv As PictDesc, IGuid As Guid
With tPicConv
.cbSizeofStruct = Len(tPicConv)
.picType = vbPicTypeBitmap
.hImage = hBmp
End With
With IGuid
.Data1 = &H20400
.Data4(0) = &HC0
.Data4(7) = &H46
End With
OleCreatePictureIndirect tPicConv, IGuid, True, NewPic
Set BitmapToPicture = NewPic
End Function
hBitmap = LoadImage(hModule, "#1", 0, 0, 0, LR_LOADMAP3DCOLORS)
执行后不为 0
但是图片显示的是程序的代码段
如果用一个不存在的DLL,,或是没存在的图片ID 则是空白 嘻 嘻 白话
hBitmap = LoadImage(hModule, "#1", 0, 0, 0, LR_LOADMAP3DCOLORS)
执行后是 0
图片里是空白
不知道是哪里出问题 ,,
这里把分给你了