新手提问:只有头文件和.DLL文件,没有相应的.lib文件,能不能调用DLL中的函数啊?

liounzhou 2005-06-06 09:11:18
如题。如果能,请问该如何操作?
...全文
1160 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jerry 2005-06-06
  • 打赏
  • 举报
回复 1
有头文件就好办, 象楼上那样显式连接就不用 LIB 文件了, 另外, LIB 文件也可以手工创建,这样就可以隐含地连接到DLL了 :

Visual C++ 开发工具提供了两个命令行工具,一个是dumpbin.exe,另一个是lib.exe。利用这两个工具即可从dll导出其对应的lib。

1、在命令行执行:
dumpbin /exports yourdll.dll > yourdll.def

2、编辑 yourdll.def 文件,使之格式与.def文件格式一致。比如:

EXPORTS
fn1
fn2

3、在命令行执行:
lib /def:yourdll.def /machine:i386 /out:yourdll.lib
bobob 2005-06-06
  • 打赏
  • 举报
回复
楼上已经说的很清楚了

是可以的
Kudeet 2005-06-06
  • 打赏
  • 举报
回复
可以,用显式链接,它是应用程序在执行过程中随时可以加载DLL文件。使用显式链接应用程序编译时不需要使用相应的Lib文件。

看看下面的简单例子:
//MyDLL.h
extern "C" _declspec(dllexport) int Max(int a, int b);
extern "C" _declspec(dllexport) int Min(int a, int b);

显式链接:

#include "MyDLL.h"
void main(void)
{
typedef int(*pMax)(int a,int b);
typedef int(*pMin)(int a,int b);
HINSTANCE hDLL;
PMax Max
HDLL=LoadLibrary("MyDll.dll");//加载动态链接库MyDll.dll文件;
Max=(pMax)GetProcAddress(hDLL,"Max");
A=Max(5,8);
Printf("比较的结果为%d ",a);
FreeLibrary(hDLL);//卸载MyDll.dll文件;
}
bohut 2005-06-06
  • 打赏
  • 举报
回复
有静态和动态两种,静态的需要lib而动态的只需要一个dll就可以了(但是要知道函数的定义一般是头文件)动态相对复杂一点!但是掌握了也不是很难
//第一步 定义函数指针就是你要调用的函数,参数必须一致,不然就内存泄露
typedef HANDLE (PASCAL * OPEN)(char *,int);
//第二步 定义本地函数
//一般前两步都在头文件里面声明
OPEN open;
//第三步 加载dll
HMODULE m_hLib;
m_hLib ::LoadLibrary"E:\\yewufuwu\\TERMINALDLL\\Debug\\TerminalDLL.dll");
//输入相应的路径
if(m_hLib == NULL )
{
MessageBox("动态连接库没有找到!!!","LoadLibrary",MB_OK);
return ;
}
//第四步
else
{
MessageBox("动态连接库成功打开...","LoadLibrary",MB_OK);
open=(OPEN)GetProcAddress(m_hLib, "OpenDevice");
}

//第五步
long handle =open("EF",1);



动态库下的函数如下
//*************打开终端*****************************************
HANDLE __declspec(dllexport) WINAPI
OpenDevice(char * szType,int nType)
{

hReader=theTerminal.OpenReader(szType,0);
if(hReader==0)
return 0;
DWORD ThreadID=0;
return hReader;
}

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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