迅雷看看动态logo我最关心的动态库中到底有多少函数

> 为什么动态库 中的函数无法加载
为什么动态库 中的函数无法加载
gksw626 & &
发布时间: & &
浏览:2 & &
回复:3 & &
悬赏:0.0希赛币
求助:为什么动态库 中的函数无法加载动态库代码:
&C & & __declspec(dllexport) & HWND & __stdcall & CreateCW(HWND);
int & WINAPI & DllEntryPoint(HINSTANCE & hinst, & unsigned & long & reason, & void* & lpReserved)
& return & 1;
//---------------------------------------
HWND & __stdcall & CreateCW(HWND & MainWindowHandle)
& Application-& Handle & = & MainWindowH
& Form2 & = & new & TForm2(NULL);
& SetParent(Form2-& Handle,MainWindowHandle); &
& Form2-& ShowModal();
& return & Form2-& H
调用代码:
& HINSTANCE & hI
& __showWindow &
& if(hInstance & == & NULL)
& hInstance & = & LoadLibrary( &
&Project2.dll & & );
& if(hInstance & != & NULL)
& MessageBox(NULL, &
&BEGIN &, &
& show & = & (__showWindow)GetProcAddress(hInstance, &
&CreateCW &);
& if(NULL & != & show & )
& hCwnd & = & show(Form1-& Handle & );
& MessageBox(NULL & , &
&HANSHUJIAZAISHIBAI &
&, & &, & 0);
& MessageBox(NULL, &
&动态库加载失败 &, & &, & 0);
看代码是没什么问题,就是没看到__showWindow函数指针的定义
提示出什么错啦?
gkzbnx & &
08:42:37 & &
& & (0)(0)引用if(NULL != show )
hCwnd = show(Application-& Handle );
gl_huanghua & &
08:42:37 & &
& & (0)(0)引用提示都说了啊,“Cannot make a visible window modal”
我觉得是变量名的问题,因为 &Form2 &是在建立Form的时候就会导出的一个全局变量
除非你的Form2不是自动生成的,要不Form2都可以直接使用而不用代码里写new的
试下换个变量名试下
我觉得会是因为Form2已经存在,虽然你new了一个新实例赋给Form2。。。gl0o & &
08:42:37 & &
& & (0)(0)引用
本问题标题:
本问题地址:
温馨提示:本问答中心的任何言论仅代表发言者个人的观点,与希赛网立场无关。请对您的言论负责,遵守中华人民共和国有关法律、法规。如果您的言论违反希赛网问答中心的规则,将会被删除。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&2001年 总版技术专家分年内排行榜第七
2002年1月 总版技术专家分月排行榜第一
本帖子已过去太久远了,不再提供回复功能。Linux动态链接库导出函数_Linux编程_Linux公社-Linux系统门户网站
你好,游客
Linux动态链接库导出函数
来源:Linux社区&
作者:Linux
近日在项目中遇到一个问题,需要在so库中控制导出函数,即像windows平台一样,只允许制定的函数导出,而其他函数需要屏蔽掉。
注意:参考文献中有一些函数是不能编译通过的。
编译环境:gcc 4.4.3
在windows中,我们可以指定__declspec(dllexport)定义来控制导出函数,在linux下,我们也有类似的控制参数。
在GCC帮助文档 -fvisibility=default|internal|hidden|protected参数下有这样一段描述:
a superior solution made possible by this option to marking things hidden when the default is public is to make the default hidden and mark things public. This is the norm with DLL's on Windows and with -fvisibility=hidden and "__attribute__ ((visibility("default")))" instead of "__declspec(dllexport)" you get almost identical semantics with identical syntax. This is a great boon to those working with cross-platform projects.
需要了解的是,在linux下,源文件中的所有函数都有一个默认的visibility属性为public,在编译命令中加入-fvisibility=hidden参数,会将所有默认的public的属性变为hidden。此时,如果对函数设置__attribute__ ((visibility("default")))参数,使特定的函数仍然按默认的public属性处理,则-fvisibility=hidden参数不会对该函数起作用。所以,设置了-fvisibility=hidden参数之后,只有设置了__attribute__ ((visibility("default")))的函数才是对外可见的,如此则效果等同于Visual Studio下的__declspec(dllexport)定义。
下面看一个例子:
#include&stdio.h&#include&string.h&#include&stdlib.h&extern int test (int i);__attribute ((visibility("default"))) int test2 (int i){& &
test(i);& &
printf("this is test2/n");}int test3 (int i){& &
printf("this is test 3/n");}
此时调用以下命令编译:
gcc -shared -o test.so -fvisibility=hidden test.c
可以获得test.so文件,用以下命令查看so文件属性:
readelf -s test.so
得到以下结果:
Symbol table '.dynsym' contains 12 entries:&
Num:& & Value& Size Type& & Bind&
Vis& & & Ndx Name& &
0 NOTYPE& LOCAL& DEFAULT& UND & &
0 NOTYPE& WEAK&
DEFAULT& UND __gmon_start__& &
0 NOTYPE& WEAK&
DEFAULT& UND _Jv_RegisterClasses& &
0 NOTYPE& GLOBAL DEFAULT& UND test& &
0 FUNC& & GLOBAL DEFAULT& UND puts@GLIBC_2.0 (2)& &
0 FUNC& & WEAK&
DEFAULT& UND __cxa_finalize@GLIBC_2.1.3 (3)& &
0 NOTYPE& GLOBAL DEFAULT& ABS _end& &
7: 0000200c& &
0 NOTYPE& GLOBAL DEFAULT& ABS _edata& &
8: 0000049c& & 31 FUNC& & GLOBAL DEFAULT&
12 test2& &
9: 0000200c& &
0 NOTYPE& GLOBAL DEFAULT& ABS __bss_start& & 10: & &
0 FUNC& & GLOBAL DEFAULT&
10 _init& & 11: & &
0 FUNC& & GLOBAL DEFAULT&
13 _finiSymbol table '.symtab' contains 56 entries:&
Num:& & Value& Size Type& & Bind&
Vis& & & Ndx Name& &
0 NOTYPE& LOCAL& DEFAULT& UND & &
0 SECTION LOCAL& DEFAULT& & 1 & &
0 SECTION LOCAL& DEFAULT& & 2 & &
3: 0000015c& &
0 SECTION LOCAL& DEFAULT& & 3 & &
0 SECTION LOCAL& DEFAULT& & 4 & &
0 SECTION LOCAL& DEFAULT& & 5 & &
0 SECTION LOCAL& DEFAULT& & 6 & &
0 SECTION LOCAL& DEFAULT& & 7 & &
0 SECTION LOCAL& DEFAULT& & 8 & &
0 SECTION LOCAL& DEFAULT& & 9 & & 10: & &
0 SECTION LOCAL& DEFAULT&
10 & & 11: & &
0 SECTION LOCAL& DEFAULT&
11 & & 12: & &
0 SECTION LOCAL& DEFAULT&
12 & & 13: & &
0 SECTION LOCAL& DEFAULT&
13 & & 14: & &
0 SECTION LOCAL& DEFAULT&
14 & & 15: & &
0 SECTION LOCAL& DEFAULT&
15 & & 16: 00001f04& &
0 SECTION LOCAL& DEFAULT&
16 & & 17: 00001f0c& &
0 SECTION LOCAL& DEFAULT&
17 & & 18: 00001f14& &
0 SECTION LOCAL& DEFAULT&
18 & & 19: 00001f18& &
0 SECTION LOCAL& DEFAULT&
19 & & 20: 00001fe8& &
0 SECTION LOCAL& DEFAULT&
20 & & 21: 00001ff4& &
0 SECTION LOCAL& DEFAULT&
21 & & 22: & &
0 SECTION LOCAL& DEFAULT&
22 & & 23: 0000200c& &
0 SECTION LOCAL& DEFAULT&
23 & & 24: & &
0 SECTION LOCAL& DEFAULT&
24 & & 25: & &
0 FILE& & LOCAL& DEFAULT& ABS crtstuff.c& & 26: 00001f04& &
0 OBJECT& LOCAL& DEFAULT&
16 __CTOR_LIST__& & 27: 00001f0c& &
0 OBJECT& LOCAL& DEFAULT&
17 __DTOR_LIST__& & 28: 00001f14& &
0 OBJECT& LOCAL& DEFAULT&
18 __JCR_LIST__& & 29: & &
0 FUNC& & LOCAL& DEFAULT&
12 __do_global_dtors_aux& & 30: 0000200c& &
1 OBJECT& LOCAL& DEFAULT&
23 completed.7021& & 31: & &
4 OBJECT& LOCAL& DEFAULT&
23 dtor_idx.7023& & 32: & &
0 FUNC& & LOCAL& DEFAULT&
12 frame_dummy& & 33: & &
0 FILE& & LOCAL& DEFAULT& ABS crtstuff.c& & 34: 00001f08& &
0 OBJECT& LOCAL& DEFAULT&
16 __CTOR_END__& & 35: & &
0 OBJECT& LOCAL& DEFAULT&
15 __FRAME_END__& & 36: 00001f14& &
0 OBJECT& LOCAL& DEFAULT&
18 __JCR_END__& & 37: & &
0 FUNC& & LOCAL& DEFAULT&
12 __do_global_ctors_aux& & 38: & &
0 FILE& & LOCAL& DEFAULT& ABS test.c& & 39: 00001ff4& &
0 OBJECT& LOCAL& HIDDEN& ABS _GLOBAL_OFFSET_TABLE_& & 40: & &
0 OBJECT& LOCAL& HIDDEN&
22 __dso_handle& & 41: 00001f10& &
0 OBJECT& LOCAL& HIDDEN&
17 __DTOR_END__& & 42: 000004bb& & 20 FUNC& & LOCAL& HIDDEN&
12 test3& & 43: & &
0 FUNC& & LOCAL& HIDDEN&
12 __i686.get_pc_thunk.bx& & 44: 00001f18& &
0 OBJECT& LOCAL& HIDDEN& ABS _DYNAMIC& & 45: & &
0 NOTYPE& WEAK&
DEFAULT& UND __gmon_start__& & 46: & &
0 NOTYPE& WEAK&
DEFAULT& UND _Jv_RegisterClasses& & 47: & &
0 FUNC& & GLOBAL DEFAULT&
13 _fini& & 48: 0000049c& & 31 FUNC& & GLOBAL DEFAULT&
12 test2& & 49: 0000200c& &
0 NOTYPE& GLOBAL DEFAULT& ABS __bss_start& & 50: & &
0 NOTYPE& GLOBAL DEFAULT& UND test& & 51: & &
0 NOTYPE& GLOBAL DEFAULT& ABS _end& & 52: & &
0 FUNC& & GLOBAL DEFAULT& UND puts@@GLIBC_2.0& & 53: 0000200c& &
0 NOTYPE& GLOBAL DEFAULT& ABS _edata& & 54: & &
0 FUNC& & WEAK&
DEFAULT& UND __cxa_finalize@@GLIBC_2.1& & 55: & &
0 FUNC& & GLOBAL DEFAULT&
可以看出,so文件中包含test2()和test3()这两个函数,并且test2()的属性为default(即可见),而test3()的属性则为hidden(不可见)。
相关资讯 & & &
& (07月19日)
& (03月03日)
& (11月24日)
& (04月11日)
& (04/16/:35)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款您所在的位置: &
从动态库中获取位图资源
从动态库中获取位图资源
清华大学出版社
《Visual C++开发技术大全》第22章动态链接库编程,本章介绍了在VC 6.0环境下进行DLL开发的知识和过程。本章重点介绍了非MFC 动态链接库的应用和MFC动态链接库的开发以及DLL工具。本小节为大家介绍从动态库中获取位图资源。
22.2.5& 从动态库中获取位图资源
从动态库中获取位图资源的第一步需要使用LoadLibraryEx()函数状态动态库,通过此函数返回的句柄对动态库中的资源进行处理。第二步需要调用EnumResourceNames()函数枚举指定类型的资源。此函数会查找模块中的指定类型的每个资源,并将当前枚举出的资源名称传递给应用程序定义的回调函数。其原型为:BOOL&EnumResourceNames( &HINSTANCE&hModule,&&&&&&&&&&&&&&//&指定要枚举资源的可执行文件的模块句柄 &LPCTSTR&lpszType,&&&&&&&&&&&&&&&//&指定要枚举的资源类型 &ENUMRESNAMEPROC&lpEnumFunc,&&&&&//&指定查找到每个资源后都要执行的回调函数 &LONG&lParam);&&&&&&&&&&&&&&&&&&&//&传递给回调函数的用户自定义参数值&
其中,lpszType参数指定要枚举的资源类型,有效取值如表22-2所示。
表22-2& 可以枚举的资源的类型
其中回调函数的格式如下:BOOL&CALLBACK&EnumResNameProc( &&&HANDLE&hModule,&&&//&枚举函数正在枚举的资源所在的可执行文件的句柄 &LPCTSTR&lpszType,&&&//&正在枚举创建当前进程的模块的资源 &LPTSTR&lpszName,&&&&//&当前枚举项的资源名称 &&LONG&lParam);&&//&EnumResourceNames()函数的lParam参数传进来的用户自定义参数值&
如果需要继续枚举,则函数应该返回true返回值,如果要停止枚举,则应该返回false。下面是使用这些函数枚举位图资源的实例。void&CDLLAppSampleDlg::OnButtonGetbitmap()&&&&&&//&枚举位图资源的处理函数 &{ &&&&&m_iconList.ShowWindow(SW_HIDE);&&&&&&&&&&&&&//&显示窗口 &&&&&if(&(hLibrary&=&LoadLibraryEx(&"MORICONS.DLL",&NULL, &&&&&&&&&&&&&LOAD_LIBRARY_AS_DATAFILE&))&==&NULL&)&&&//&装载动态库 &&&&&{&&&WriteLog("文件载入错误!");&&&&&&&&&} &&&&&//&枚举资源名称 &&&&&if(!EnumResourceNames(hLibrary,RT_BITMAP, &&&&&&&&&(ENUMRESNAMEPROC)EnumBitmapProcedure,(LPARAM)GetSafeHwnd())) &&&&&&&&&WriteLog("列举位图资源停止!");&&&&&&&&&&&&&&//&输出提示信息 &&&&&FreeLibrary(hLibrary);&&&&&&&&&&&&&&&&&&&&&&&&&&//&释放动态链接库 &} &BOOL&CALLBACK&EnumBitmapProcedure(HANDLE&hModule,&LPCTSTR&lpszType, &LPTSTR&lpszName,&LONG&lParam)&&&&&&&&&&&&&&&&&&&&&&//&枚举回调函数 &{ &&&&&HBITMAP&bitmap&=&LoadBitmap((HINSTANCE)hModule,lpszName);//&装载位图 &&&&&SendMessage((HWND)lParam,&WM_BITMAP_MESSAGE, &&&&&&&&&&&&&(LPARAM)bitmap,&(WPARAM)lpszName);&&&&&&//&发送消息 &&&&&return&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&返回false &} &void&CDLLAppSampleDlg::OnBitmapMessage(WPARAM&wParam,LPARAM&lParam) &{ &&&&&Cstatic*&m_Bitmap&=&(Cstatic*)GetDlgItem(IDC_STATIC_BITMAP); &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&定义静态控件变量 &&&&&m_Bitmap-SetBitmap((HBITMAP)wParam);&&&&&&&&&&&//&装载位图 &&&&&WriteLog((const&char*)&lParam);&&&&&&&&&&&&//&输出提示信息 &}&
上面代码首先使用LoadLibraryEx()函数装载MORICONS.DLL,返回DLL的句柄,然后调用EnumResourceNames()函数枚举位图资源。此函数中的第三个参数指定了回调函数,即每次查找到一个位图资源时要执行的函数,即EnumBitmapProcedure()函数。在回调函数中,通过传入的实例句柄和资源名称,使用LoadBitmap()函数装载位图资源,并将位图资源通过消息发送给主对话框。这里可以看到,返回值为false,表示不再继续枚举,只显示动态库中的第一幅位图。主对话框接收消息,并进入OnBitmapMessage()函数,将wParam参数传入的位图资源句柄,显示在静态文本框中。程序运行效果如图22-5所示。
图22-5& 从动态库中获取位图资源
【责任编辑: TEL:(010)】&&&&&&
关于&&的更多文章
本书采用故事模式讲述一门编程语言,以一个无知的菜鸟成长过程为
本书描述了黑客用默默无闻的行动为数字世界照亮了一条道路的故事。
享誉全球的未来学家理查德.沃森,用科学和多元的视角
本书是图文并茂的Python学习参考书,书中并不包含深奥
对于任何一门编程语言来说,算法都是程序的"灵魂"。正
《网管员必读―服务器与数据存储》全面、系统地介绍了在中、高级网络管理和网络工程实施中两个重要方面的主流技术和应用:硬件服
51CTO旗下网站

我要回帖

更多关于 傻儿传奇之抗战到底 的文章

 

随机推荐