标题:
隐式链接无.LIB动态链接库
[打印本页]
作者:
look_w
时间:
2017-11-18 14:20
标题:
隐式链接无.LIB动态链接库
由于我们经常要调用一些第三方厂商或其他编译器编写的动态链接库,但是一般都不提供源文件或
.lib
文件,而作为
VC
隐式链接到
DLL
(
implicitly link to the DLL
)调用,这些却是必需的。本文将主要讨论在没有源文件及
.lib
输入库文件或欲调用
Windows
未公开函数的情况下重建
.Lib
文件的方法。在建立之前,我们首先要了解一下
DLL
输出函数的几种方式。
一、从
DLL
中输出函数的方式(
calling conventions
)
_cdecl
是
C
和
C
++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的
可执行文件大小
会比调用
_stdcall
函数的大。函数采用从右到左的压栈方式。
VC
将函数编译后会在函数名前面加上下划线前缀。
_stdcall
是
Pascal
程序的缺省调用方式,通常用于
Win32 Api
中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。
VC
将函数编译后会在函数名前面加上下划线前缀,在函数名后加上
"@"
和参数的字节数。
_fastcall
方式的函数采用寄存器传递参数,
VC
将函数编译后会在函数名前面加上
"@"
前缀,在函数名后加上
"@"
和参数的字节数。
用
VC
建立一个空的动态链接库,并加入以下三个文件:
//noname.h
动态链接库头文件
extern "C" void _stdcall stdcallproc(void);
extern "C" void _cdecl cdeclproc(void);
extern "C" void _fastcall fastcallproc(void);
//noname.cpp
动态链接库实现文件
编译器产生如下错误:
DllCaller.obj : error LNK2001: unresolved external symbol @fastcallproc@0
DllCaller.obj : error LNK2001: unresolved external symbol _nonameproc@0
根据错误提示信息将
noname.def
更改如下:
@fastcallproc@0 @3
nonameproc@0 @1
重新生成
noname.lib
,即可重新编译
DllCaller.exe
。
四、调用
Windows
未公开函数
根据以上分析,下面给出一个简单的调用
Window98
系统
Shell32.DLL
中序号为
60
的未公开函数,执行后将出现重新启动的对话框。
//shell32.def
,据此生成
Shell32.LIB
LIBRARY "shell32"
EXPORTS
SHShutDownDialog@4 @60
// DllCaller.cpp:
调用未公开函数的控制台程序
//
函数声明
extern "C" long _stdcall SHShutDownDialog(long lShutdown);
//
链接输入库文件
#
pragma comment(lib,"debug/shell32.lib")
int main(int argc,char
*
argv[])
{
SHShutDownDialog(0);
return 0;
}
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0