c++怎么调用一个dll文件啊,重新封装然后暴露里面的接口,原来的dll接口都没暴露出来,谢谢大家 30

qq:624403996已搞定,各位没能理解我的意思啊,技术问题不能乱选,只能关闭问题了,谢谢大家... qq:624403996
已搞定,各位没能理解我的意思啊,技术问题不能乱选,只能关闭问题了,谢谢大家
展开
 我来答
百度网友d580670
2011-11-10 · TA获得超过1983个赞
知道大有可为答主
回答量:2054
采纳率:82%
帮助的人:676万
展开全部
三、重建.Lib输入库文件
根据微软的建议,要想隐式地链接到一个DLL,可执行程序必须从DLL的提供者那儿得到一个包含输出函数的头文件(.h文件)、一个用于链接的输入库(.lib文件)。愿望是很好的,但是一般情况下,我们都无法得到第三方动态链接库的输入库文件,或者我们需要调用Windows未公开函数。如果你是使用Delphi或Visual Basic开发程序,那么,你只要简单的申明一下函数和输出库就可以了。但是,使用VC的朋友们只好重建.Lib文件了。
1.删掉第一步中生成的noname.lib(假设我们没有这个文件)。
2.用微软的DumpBin.exe:dumpbin /exports noname.dll>noname.def,留下noname.def文件的输出段:
ordinal hint RVA name
2 0 00001005 cdeclproc
3 1 0000100F fastcallproc
1 0000100A [NONAME]
修改为:
LIBRARY "noname"
EXPORTS
cdeclproc @2
fastcallproc @3
nonameproc @1 //请注意与第一步中noname.def的区别:nonameproc可以自己指定为任何名字
再执行lib.exe /def:noname.def即可生成noname.lib文件(但如果这个动态链接库不仅仅包含_cdecl类型函数,那么这个noname.lib还不是最终可用的.lib文件,具体请看下文)。
3.建立一个名为DllCaller的Win32控制台程序,将刚才生成的noname.dll和noname.lib拷入DllCallerdebug目录。
//DllCaller.cpp
//声明函数原型
extern "C" void _stdcall nonameproc(void);
extern "C" void _cdecl cdeclproc(void);
extern "C" void _fastcall fastcallproc(void);
//链接输入库文件
#pragma comment(lib,"debug\noname.lib")
int main(int argc, char* argv[])
{
nonameproc();
cdeclproc();
fastcallproc();
return 0;
}
编译器产生如下错误:
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;
}
黯阁梧桐一叶
2011-11-10
知道答主
回答量:27
采纳率:0%
帮助的人:26.1万
展开全部
typedef 返回类型 (函数指针)(参数,参数……)
如DLL中有一个函数int aFunc(int a,int b);
typedef int (*FuncA)(int a,int b);
调用的时候
HINSTANCE pDll = LoadLibrary("dllName");
if(pDll == NULL)
return;
FuncA funca = (FuncA)GetProcAddress(pDll,"aFunc");
funca(0,1);
大概就是这样吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xunxunnuaa
2011-11-10 · TA获得超过651个赞
知道小有建树答主
回答量:548
采纳率:0%
帮助的人:441万
展开全部
没有头文件,不知道dll接口是无法使用的,否则可以用LoadLibrary
追问
都知道,我导入能看到接口,不知道怎么调用
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式