如何获得DLL里的各种资源(在不知资源名字的情况下)

leemingsong 2000-07-26 03:33:00
本人新手,最近遇到头痛的问题?在进军DLL资源观察器的途中受阻几天都没得解脱”(在不知资源名字的情况下)如何获得DLL里的资源呢?在查了MSDN帮助后得知要用EnumResourceNames及EnumResNameProc回调函数,但回调函数从来没用过,经调试又发现新问题BOOL (CALLBACK EnumResNameProc)(HMODULE hModule, const char* lpszType, char* lpszName,LONG lParam )
{
char Test[256];
strcpy(Test,lpszName); //为什么此条语句不能做???(问题出处)
//经常出现cc3250mt.dll调用出错。
//原因是不是内存做了什么保护什么的?
}
请各位编程Expert指点迷津!!!,以上思路对吗?还有没有更好的别的办法!
...全文
197 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
leemingsong 2000-07-27
  • 打赏
  • 举报
回复
用sprinft(..,"%u",..)转换后怎么转回来呢?
JGTM2000 2000-07-27
  • 打赏
  • 举报
回复
另外要注意,传给回调函数的lpName不一定是字串,要判断不然会出内存错误:

// Write the resource name to a resource information file.
// The name may be a string or an unsigned decimal
// integer, so test before printing.

if ((ULONG)lpName & 0xFFFF0000)
{
cbString = sprintf(szBuffer, "\tName: %s\n", lpName);
}
else
{
cbString = sprintf(szBuffer, "\tName: %u\n",
(USHORT)lpName);
}
halfdream 2000-07-26
  • 打赏
  • 举报
回复
哦, 原来你没有明白回调函数。
先声明一下你定义的回调函数:
BOOL CALLBACK EnumRNameProc( //这函数名是什么没有关系,你
//定义的是什么名字就是什么名字.
HANDLE hModule, // resource-module handle
LPCTSTR lpszType, // pointer to resource type
LPTSTR lpszName, // pointer to resource name
LONG lParam // application-defined parameter
)
{
...
Form1->ListBox1->Items->Add(AnsiString(lpszName));
return true;
}


然后在需要时候这样调用:

EnumResourceNames(hDLL,RT_BITMAP, //hDll 你载入DLL的句柄.
(ENUMRESNAMEPROC)EnumRNameProc, 0 );
//这儿只是列出Bitmap资源.
halfdream 2000-07-26
  • 打赏
  • 举报
回复
。。。
char Test[256];
~~~~~~~、你这是在堆栈中分配的内存,
函数调用过后过不用了,自然不行。
你的思路也不大对, 每次枚举一个资源,便调用一次这回调函数,
你这样是无法取得资源信息的。
strcpy(Test,lpszName);
。。。

既然用的是BCB ,那做起来就比较简单:
你可以用一个TStrings之类的来保存取得的资源名
比如加一个ListBox
然后在回调函数中这样写:
{
Form1->ListBox1->Items->Add(AnsiString(lpszName));

}

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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