散分散分:VC6/7下资源文件怎么共享?

graphviz 2003-11-02 06:53:12
客户端和服务器端是分开的2个工程,但用到了完全相同的一些资源,所以希望把它单独拿出来,然后分别包含在每一个工程里面,希望这样容易维护一点,但是在连接的时候总是出错,怎么解决?请高手帮忙!
...全文
60 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yintongshun 2003-11-29
  • 打赏
  • 举报
回复
做成资源DLL
纯资源DLL的编写
下面的例子是一个纯资源DLL的源程序
纯资源的DLL就是只包含资源的DLL,例如:图标,位图,字符串,声音,视频,对话框等。使用纯资源DLL可以节约可执行文件的大小,可以被所有的应用程序所共享,从而提高系统性能。纯资源DLL的编写比普通的DLL要简单的多,首先创建一个WIN32 DLL工程,不是MFC的DLL,然后创建一个资源文件 *.RC,添加到资源DLL的工程中去。然后添加一个初始化DLL的原文件。


#include

extern "C"
BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID )
{
return 1;
}

这是纯资源DLL所必须需的代码,保存这个文件为*.CPP。编译这个资源DLL。

在应用程序显示的调用这个DLL,使用LoadLibrary函数装入资源DLL,FindResource和LoadResource来装入各种资源,或者使用下列的特定的资源装入函数:

FormatMessage
LoadAccelerators
LoadBitmap
LoadCursor
LoadIcon
LoadMenu
LoadString
当资源使用结束,你的应用程序须调用FreeLibrary函数来释放资源。

下面就讲一下如何调用编写好的资源DLL

首先在应用程序中声明一个DLL的句柄,HINSTANCE m_hLibrary;在OnCreate( )函数中调用LoadLirbrary( ),在OnDestory( )中调用FreeLibrary()。下载一个工程文件看一看,就什么都搞定了。


http://www.china-askpro.com/msg35/qa41.shtml
如何显示资源DLL中的对话框
编号:QA003441
建立日期: 2000年10月23日 最后修改日期:2000年10月23日
所属类别:

C/C++ - 窗体与菜单

famugong:
操作系统: win98&win2000
编程工具: vc++6.0
问题: how to use a Resource-Only DLL?
我要使用Resource-Only DLL,下面是我编程的主要步骤:
DLL: 用appwizard产生了一个win32 dll;
然后project->new加入了一新的rc文件;
insert一个dialog;(ID:IDD_DIALOG,Caption:Dialog)
project->setting-link表中加入/NOENTRY;
编译生成Resource.dll文件。
客户程序是一个简单的基于对话框的exe,只有ok和cancel两个button,我希望按下ok就能显示dll中定义的对话框。
OnOk()
{
HINSTANCE hDll;
HRSRC hRes;
//HGLOBAL hGlobal;
hDll=LoadLibrary("ResourceDLL.dll");
if(hDll==NULL)
AfxMessageBox("Can't Load the library");
else AfxMessageBox("success");
hRes=FindResource(???????,"????????",RT_DIALOG);
if(hRes==NULL)
AfxMessageBox("Can't Find the Resource");
else AfxMessageBox("success");
...
}
这里FindResource()的参数应是什么?
LoadResource()之后用什么函数来显示dll中的对话框?
请帮我把代码补全,谢谢!
水平: 刚入门

回答:

对于象对话框、位图、图标这些标准资源,一般不使用FindResource,只有对于非标准资源,才使用FindResource(参考QA000146 "如何装入一个资源中的ANI光标")。下面分MFC和SDK两种方式讨论你的问题。
1、如果采用MFC方式,可以使用AfxSetResourceHandle设置资源DLL的句柄,如:
hDll=LoadLibrary("ResourceDLL.dll");
if(hDll==NULL)
AfxMessageBox("Can't Load the library");
else AfxMessageBox("success");
AfxSetResourceHandle(hDLL);
...
}
这样以后你再使用CDialog创建对话框时,对话框将来自你的资源DLL,而不是.exe文件。如果你在程序中还要使用.exe中的资源,你需要在 AfxSetResourceHandle之前,先使用 AfxGetResourceHandle保存当前的资源文件句柄。
2、SDK方式。你在调用CreateDialog或DialogBox时,它们的第一个参数都是HINSTANCE,就是你LoadLibrary获得的句柄。你不需要使用FindResource,CreateDialog或DialogBox会自动查找资源并加载。


lb910 2003-11-29
  • 打赏
  • 举报
回复
做成资源DLL
graphviz 2003-11-14
  • 打赏
  • 举报
回复
自己顶!
有没有高人出来给点见解啊?
BuZhang_AP97091 2003-11-03
  • 打赏
  • 举报
回复
同意楼上!
graphviz 2003-11-03
  • 打赏
  • 举报
回复
为什么要这么做?举例来说,客户端和服务器端都要用到相同的对话框,我就希望能把这个对话框资源作为公用资源来用,以后想修改时不必分别修改2个地方,也容易保证修改的一致性。再举个例子,就是和AfxMessageBox(...)类似,只是我的对话框相对复杂一些,要用到资源文件
carbon107 2003-11-03
  • 打赏
  • 举报
回复
你可以说说你为什么要这样做吗? 当原来使用一个资源的时候,它们分别是找各自的吧
tonyzhengjq 2003-11-03
  • 打赏
  • 举报
回复
up一下
lanfanghelanfanghe 2003-11-03
  • 打赏
  • 举报
回复
Up
dzds 2003-11-03
  • 打赏
  • 举报
回复
邦你顶一下吧
dzqsuper 2003-11-02
  • 打赏
  • 举报
回复
都两个小时还没有来顶一下


那我就来做个好人


友情的邦你顶一下吧


楼主

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧