vc++ 6.0描述:
我有一个工程A,其中有一个对话框(D)资源及相关类C和对话框需要的几个bmp(且只有D需要)资源,后来我把D和C及bmp独立出来放到了新建的MFC extern DLL工程B中,A中删除了D和C 但没有删除bmp.我在A工程中调用B工程生成的b.dll,一切正常,后来发现a.exe有点大,我觉得A中的几个bmp应该没用了就删除了,结果发现对话框D中的图片不能显示了...问题:
b.dll中包含不包含bmp资源?
b.dll和a.exe中的资源有什么关系?
怎样做才能让b.dll用自已的bmp资源,即a.exe中的bmp可以删除掉?请了解的朋友指点迷津,谢谢!

解决方案 »

  1.   

    - - 没看清楚什么意思,不过LZ用VC6使用资源方式打开b.dll和a.exe就知道有没有bmp资源了。
      

  2.   

    是我没描述清楚,我再说一下:
    原来只有A工程:
    A: source files
           A.cpp
           C.cpp(对应对话框资源 IDD_DIALOG_D)
           ...
       head files
           A.h
           C.h       ...
       resources
           Dialog
               IDD_DIALOG_D

           Bitmap
               IDB_BITMAP_B
    (只在对话框 IDD_DIALOG_D 中用)改造后有A(exe)和B(mfc extern dll)两个工程: (改造A工程是想把对话框独立出来复用, 也可以减小A.exe的大小)
    A: source files
           A.cpp
           ...
       head files
           A.h
           ...
       resources
           Bitmap
               IDB_BITMAP_B
    (只在对话框 IDD_DIALOG_D 中用)B: source files
           B.cpp
           C.cpp(对应对话框资源 IDD_DIALOG_D)
           ...
       head files
           B.h
           C.h
           ...
       resources
           Dialog
               IDD_DIALOG_D
           Bitmap
               IDB_BITMAP_B
    (只在对话框 IDD_DIALOG_D 中用)B 编译后生成 B.dll, 把 B.lib 链接到工程 A 编译出 A.exe, 最后把 A.exe 和 B.dll 放一起运行.我觉得 B.dll 中有 bmp 资源, A.dll 中也有bmp资源, 
    但为什么我把改造后的 A 工程中的 bmp 资源删除后编译的 A.exe
    和 B.dll 放在一起运行时对话框上的图片没有了?
      

  3.   

    可能因为需要进行资源模块句柄的切换,在Dll中的涉及资源调用函数中的第一行添加以下语句试试:
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
      

  4.   

    首先,A中的bmp是肯定可以删的   你可能把b的资源链到A了  要用B中自己的bmp
    还有,要加楼上的那一句
      

  5.   

    问题已解决,谢谢三位朋友的关注和指点!附:
    原来B.dll中加载bmp的方法:
    ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP_B));修改后B.dll中加载bmp的方法:
    ::LoadBitmap(::GetModuleHandle("B.dll"), MAKEINTRESOURCE(IDB_BITMAP_B));修改前得到的是exe的实例句柄,修改后得到dll的句柄,即mfc extension dll中 AfxGetInstanceHandle()
    返回的是exe的实例句柄。