社区
进程/线程/DLL
帖子详情
我想用vc来调用dll,那应该怎么办?
土豆薯条
2003-08-22 03:45:21
我想用vc来调用dll,那应该怎么办?
...全文
17
7
打赏
收藏
我想用vc来调用dll,那应该怎么办?
我想用vc来调用dll,那应该怎么办?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wantvictory
2003-09-12
打赏
举报
回复
http://www.pcvc.net/category/content.asp?sendid=188
warmchang
2003-09-08
打赏
举报
回复
LoadLibrary和GetProcAddress两个函数!
yanzai8848
2003-09-08
打赏
举报
回复
方法一:显式链接
显式链接到 DLL 的进程调用 GetProcAddress 来获取 DLL 导出函数的地址。使用返回的函数指针调用 DLL 函数。GetProcAddress 将(由 LoadLibrary、AfxLoadLibrary 或 GetModuleHandle 返回的)DLL 模块句柄和要调用的函数名或函数的导出序号用作参数。
由于是通过指针调用 DLL 函数并且没有编译时类型检查,需确保函数的参数是正确的,以便不会超出在堆栈上分配的内存和不会导致访问冲突。确保类型安全的一种方法是查看导出函数的函数原型,并创建函数指针的匹配 typedef。例如:
typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);
...
HINSTANCE hDLL; // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer
DWORD dwParam1;
UINT uParam2, uReturnVal;
hDLL = LoadLibrary("MyDLL");
if (hDLL != NULL)
{
lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,
"DLLFunc1");
if (!lpfnDllFunc1)
{
// handle the error
FreeLibrary(hDLL);
return SOME_ERROR_CODE;
}
else
{
// call the function
uReturnVal = lpfnDllFunc1(dwParam1, uParam2);
}
}
调用 GetProcAddress 时指定所需函数的方式取决于 DLL 的生成方式。
仅当要链接到的 DLL 是用模块定义 (.DEF) 文件生成的,并且序号在 DLL 的 .DEF 文件的 EXPORTS 节中与函数一起列出时,才能获取导出序号。如果 DLL 具有许多导出函数,则相对于使用函数名,使用导出序号调用 GetProcAddress 的速度稍快一些,因为导出序号是 DLL 导出表的索引。使用导出序号,GetProcAddress 可直接定位函数,而不是将指定名称与 DLL 导出表中的函数名进行比较。但是,仅当有权控制 .DEF 文件中导出函数的序号分配时,才应使用导出序号调用 GetProcAddress。
方法二:隐式链接
为隐式链接到 DLL,可执行文件必须从 DLL 的提供程序获取下列各项:
包含导出函数和/或 C++ 类的声明的头文件(.H 文件)。
要链接的导入库(.LIB files)。(生成 DLL 时链接器创建导入库。)
实际的 DLL(.DLL 文件)。
使用 DLL 的可执行文件必须包括头文件,此头文件包含每个源文件中的导出函数(或 C++ 类),而这些源文件包含对导出函数的调用。从编码的角度讲,导出函数的函数调用与任何其他函数调用一样。
若要生成调用可执行文件,必须与导入库链接。如果使用的是外部生成文件,请指定导入库的文件名,此导入库中列出了要链接到的其他对象 (.OBJ) 文件或库。
操作系统在加载调用可执行文件时,必须能够定位 .DLL 文件。
土豆薯条
2003-09-08
打赏
举报
回复
有没有
土豆薯条
2003-09-02
打赏
举报
回复
有没有dll的源文件
hacke
2003-08-29
打赏
举报
回复
两中方法:静态调用,动态调用
zhouyong0371
2003-08-25
打赏
举报
回复
如果有.lib,.h,那么,将这两个文件放在工程目录并加入工程里边
将.dll放在系统目录就可以了
如果只有.dll没有.lib,只要知道函数声明,也就是知道.h
参考如下例子:
void HideProcess()
{
HINSTANCE hInst = LoadLibrary("KERNEL32.DLL");
if(hInst)
{
typedef DWORD (WINAPI *MYFUNC)(DWORD,DWORD);
MYFUNC RegisterServiceProcessFun = NULL;
RegisterServiceProcessFun = (MYFUNC)GetProcAddress(hInst, "RegisterServiceProcess");
if(RegisterServiceProcessFun)
{
RegisterServiceProcessFun(GetCurrentProcessId(),1);
}
FreeLibrary(hInst);
}
}
VC
调用
DLL
中资源
VC
调用
DLL
中资源 文档+代码 很详细 很通用
VC
中
DLL
的
调用
规则
VC
中
DLL
的
调用
规则
VC
中
DLL
的
调用
规则
VC
中
DLL
的
调用
规则
VC
中
DLL
的
调用
规则
VC
中
DLL
的
调用
规则
用
VC
#.NET开发交互式CAD系统
用
VC
#.NET开发交互式CAD系统,包括结合GDI+和OPENGL两种方案。 联系平台客服可开发票。
VC
6
调用
unrar.
dll
实例
VC
6
调用
unrar.
dll
实例
VC
6
调用
unrar.
dll
实例
java
调用
vc
的
dll
java
调用
vc
的
dll
,java
调用
vc
的
dll
,java
调用
vc
的
dll
,java
调用
vc
的
dll
进程/线程/DLL
15,471
社区成员
49,182
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章