1,我没有写过DLL,
2,有几个图片(程序里的背景之类)在程序外不想让客户看到
3,VB 也能调用这几张图片显示各位大哥大姐,,帮忙一下

解决方案 »

  1.   

    作为DLL的资源加进去就行了呀。
      

  2.   

    放在资源中,
    外部程序调用的话,用LoadResource, LockResource
      

  3.   

    LoadResource这东西,,在VB里什么用
      

  4.   

    BITMAPINFO * LoadBMP(HMODULE hModule, const TCHAR * pResName)
    {
    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近来
      

  5.   

    在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 对象
      

  6.   

    又想了一下,可以在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
        
        LoadBitmapFromDll = LoadBitmap(hModule, nResourceID)
        
        FreeLibrary hModule
    End Function当然,资源ID仍然是你在 DLL 的 Resource.H 中定义的资源ID
      

  7.   

    VB中应该讲得有怎么调用API吧,(VB偶没有用过)
      

  8.   

    这里可是vc版啊,我不会vb,楼主可以去vb版问问撒
      

  9.   

    xlt123(杀了你好吗) ?不好!我试一下,,
      

  10.   

    xlt123(杀了你好吗) ?
    LoadBitmapFromDll 这个函数调用成攻返回一个大于0的整 数,,失败返回0 是不是
    不知道什么
    什么把图片指定给一个Pictuerbox OR Image
      

  11.   

    http://community.csdn.net/Expert/topic/3370/3370100.xml?temp=.26112各位老大再帮一下嘛,,,已经再开了一个贴了,,,真的不懂
    xlt123(杀了你好吗)   他的方法好像是可以的,,,只是LoadBitmapFromDll 返回的好像
    是图片的句柄(也不知道叫对了没有),,Picture1.Picture = LoadBitmapFromDll (101)
    会提示"类型不匹配"
      

  12.   

    前两个问题比较简单,用LoadResource一系的函数就可以了,用vb调关键是类型转换的问题,要问vb高手了有个笨方法,就是让dll暴露一个另存资源的函数接口,然后先调用这个接口生成bmp文件,然后把路径传给vb就可以调用了
      

  13.   

    类型不匹配--注意vc和vb之间类型的转换
      

  14.   

    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
      

  15.   

    读出来的图片成了 ,,程序的代码片断,,
    hBitmap = LoadImage(hModule, "#1", 0, 0, 0, LR_LOADMAP3DCOLORS)
    执行后不为 0
    但是图片显示的是程序的代码段    
    如果用一个不存在的DLL,,或是没存在的图片ID  则是空白 嘻 嘻    白话
    hBitmap = LoadImage(hModule, "#1", 0, 0, 0, LR_LOADMAP3DCOLORS)
    执行后是 0     
    图片里是空白
    不知道是哪里出问题  ,,
      

  16.   

    rainstormmaster(暴风雨 v2.0)    谢谢在http://community.csdn.net/Expert/topic/3370/3370100.xml?temp=.26112  
    这里把分给你了