新手提问:只有头文件和.DLL文件,没有相应的.lib文件,能不能调用DLL中的函数啊? 如题。如果能,请问该如何操作? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有静态和动态两种,静态的需要lib而动态的只需要一个dll就可以了(但是要知道函数的定义一般是头文件)动态相对复杂一点!但是掌握了也不是很难//第一步 定义函数指针就是你要调用的函数,参数必须一致,不然就内存泄露typedef HANDLE (PASCAL * OPEN)(char *,int);//第二步 定义本地函数//一般前两步都在头文件里面声明OPEN open;//第三步 加载dllHMODULE 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) WINAPIOpenDevice(char * szType,int nType){ hReader=theTerminal.OpenReader(szType,0); if(hReader==0) return 0; DWORD ThreadID=0; return hReader;} 可以,用显式链接,它是应用程序在执行过程中随时可以加载DLL文件。使用显式链接应用程序编译时不需要使用相应的Lib文件。看看下面的简单例子://MyDLL.hextern "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 MaxHDLL=LoadLibrary("MyDll.dll");//加载动态链接库MyDll.dll文件;Max=(pMax)GetProcAddress(hDLL,"Max");A=Max(5,8);Printf("比较的结果为%d ",a);FreeLibrary(hDLL);//卸载MyDll.dll文件;} 有头文件就好办, 象楼上那样显式连接就不用 LIB 文件了, 另外, LIB 文件也可以手工创建,这样就可以隐含地连接到DLL了 :Visual C++ 开发工具提供了两个命令行工具,一个是dumpbin.exe,另一个是lib.exe。利用这两个工具即可从dll导出其对应的lib。1、在命令行执行:dumpbin /exports yourdll.dll > yourdll.def2、编辑 yourdll.def 文件,使之格式与.def文件格式一致。比如:EXPORTS fn1 fn23、在命令行执行:lib /def:yourdll.def /machine:i386 /out:yourdll.lib picture控件图片失真 CMFCMenuBar自定义菜单的问题,请进来看看 表格 基础问题 : 程序状态有哪几种? 急啊 Dll问题 为了程序的可重用性,在一个程序里面导入另外一个程序里面的对话框,在资源里面import不行?? 文本到多行文本的转化? 怎样才能将vfw捕获的位图从中扣出一部分,并将其直接存成jpeg格式。 有没有串口通讯方面的高手?HELP! 欢迎大家加入我的群,一起讨论问题 欢迎大家加入我的群,一起讨论问题
//第一步 定义函数指针就是你要调用的函数,参数必须一致,不然就内存泄露
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;
}
//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文件;
}
dumpbin /exports yourdll.dll > yourdll.def2、编辑 yourdll.def 文件,使之格式与.def文件格式一致。比如:EXPORTS
fn1
fn23、在命令行执行:
lib /def:yourdll.def /machine:i386 /out:yourdll.lib