1.lib库我们称之为静态库,在编译的时候调用,而dll库早使用的时候地时候调用。
如果你希望自己写的库既能给c语言用,又能给c++语言用。就需要写一个宏,如下所示,这个宏表不管是C++工程调用还是C工程调用,都以C的方式调用
#ifdef __cplusplus
extern "C"
{
#endif
int ADD(int a,int b);
#ifdef __cplusplus
}
#endif
6.库函数返回的数据类型
3.2 显示加载方式加载dll
另一种是通过LoadLiabrary函数显示加载dll。代码如下。需要注意的是这时候我们不再需要注册.lib文件,也不需要声明外部函数。只要在需要使用的地方调用dll文件即可。
void CXXXDlg::OnBtnSubtract()
{
// TODO: Add your control notification handler code here
HINSTANCE hInst;
hInst = LoadLibrary(L"Dll1.dll");
typedef int(*SUBPROC)(int a, int b);
SUBPROC Sub = (SUBPROC)GetProcAddress(hInst, "subtract");
CString str;
str.Format(_T("5-3=%d"), Sub(5, 3));
FreeLibrary(hInst); //LoadLibrary后要记得FreeLibrary
MessageBox(str);
}
动态库加载出现的问题:
方案1:
usb.h文件:
#ifndef USBDLL_H
#define USBDLL_H
//
//
//条件编译指令
#ifndef _ADDAPI
#define ADDAPI _declspec(dllexport)
#else
#define ADDAPI _declspec(dllimport)
#endif
//
//声明导出函数
//__declspec(dllexport)
extern "C" int ADDAPI getUSbDev();///导出函数
extern "C" int ADDAPI sendUSbmessage();extern "C" 改为C语言的调用方法,cpp文件函数就不会被改名
#endif
usb.cpp文件:
typedef int (*PADD)(int a,int b);
typedef int (*SUB)(int a,int b);
///注意C++语法会改变动态库函数的名字,必须将函数的名字从usbdll.cpp改为usbdll.c
int main()
{
HMODULE hdll=LoadLibrary(L"../Debug/testdll.dll");
if (hdll==NULL)
{
printf("动态可加载失败 ")
}
PADD pAdd=(PADD)GetProcAddress(hdll,"add");
SUB pSUb =(SUB)GetProcAddress(hdll,"sub");
//pAdd就是add,pSUb就是sub函数
FreeLibrary(hdll);///动态加载的好处就是可以自动释放
}
方案2:
#pragma comment(lib,"hid.lib");隐式调用动态库,不存在函数名乱码问题
方案3:
创建模块定义文件(def文件)。将函数名字依次每列写进去。动态库函数名字就不会被改