DLL def文件导出 在使用DEF文件导出的dll的程序中,需要声明各个导出的函数吗? 如果需要是使用dll中编译后的函数名(也就是DEF文件中的函数名)吗?如果是那在应用程序中编译的时候会不会再度被修饰? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 使用了def就会制定导出函数名,从而防止被修饰使用了def,也还可以申明导出函数 int add(int a,int b){ return a + b ;}int subtract(int a,int b){ return a - b ;}这段代码写于.cpp中LIBRARY Dll2 //.dll名EXPORTS addsubtract这段代码写于.def中这样导出的函数就是add和subtract函数啦 怎么防止被修饰呢? extern "c"? 指定导出函数名是什么意思? extern C是以C的方式修饰导出函数名def就是告诉编译器不要修饰.. 没关系的,其实只要dll能用就可以了, 是在DLL中不要修饰 那在应用程序中使用的时候也不会修饰吗? extern "C"是为了实现C++与C及其它语言的混合编程,使编译器对函数的编译采用C方式可以用.DEF防止函数名被修饰 void CDllTestDlg::OnBtnAdd() //点击按钮,显示5+3的值{ // TODO: Add your control notification handler code here HINSTANCE hInst; hInst = LoadLibrary("Dll2.dll"); typedef int (* ADDPROC)(int a,int b); ADDPROC Add = (ADDPROC) GetProcAddress(hInst,"add"); if(!Add) { MessageBox("获取函数地址失败!"); return ; } CString str; str.Format("5+3=%d",Add(5,3)); MessageBox(str); FreeLibrary(hInst);}这是其中的一种使用方式,lz看一下吧。 void CDllTestDlg::OnBtnAdd() { // TODO: Add your control notification handler code here HINSTANCE hInst; hInst = LoadLibrary("Dll2.dll"); typedef int (* ADDPROC)(int a,int b); ADDPROC Add = (ADDPROC) GetProcAddress(hInst,"add"); if(!Add) { MessageBox("获取函数地址失败!"); return ; } CString str; str.Format("5+3=%d",Add(5,3)); MessageBox(str); FreeLibrary(hInst);}这是使用.dll的一种方式,要把导出的Dll2.dll放在要使用的工程下,lz看一下吧 def制定函数名了,应用程序使用的时候,就可以直接用函数名来GetProcAddress 那要是用lib文件静态调用呢? DEF主要是用于DLL的动态调用的,可以使得导出函数按你的意愿具有好的“可读性”,这样GetProcAddress时也看着比较舒服;LIB文件用于DLL的静态调用,里面的符号跟def文件没联系,也就是说里面的符号还是经过编译器改编过的,和头文件配合使用 def主要是用在动态调用,你静态调用lib,直接包含导出dll的h文件,然后就可以调用h中的函数,不用关心函数修饰.. 哥们们,给你们看个视频,我被感动了。。。 还是SOCKET编程 菜鸟提问:有关vc读取Access数据库的问题!急!!! 请教贴图问题! 请教CListCtrl控件,如何响应右键菜单。 提供源码,有兴趣的可以试试? (在线等待)请问怎样把光标设成其它形式(比如漏斗型的) 请问在ActiveX/com里用什么类代替CWnd? 如何在CListCtrl中可以选中subitem? 同时10个上传文件,怎样把每个上传文件的进度值显示在主对话框的列表框中 【微软面试题】请计算出1的个数 怎样导出为XML,软件界面的背景为什么是粉色的
使用了def,也还可以申明导出函数
int add(int a,int b)
{
return a + b ;
}int subtract(int a,int b)
{
return a - b ;
}这段代码写于.cpp中
LIBRARY Dll2 //.dll名EXPORTS
add
subtract这段代码写于.def中
这样导出的函数就是add和subtract函数啦
def就是告诉编译器不要修饰..
可以用.DEF防止函数名被修饰
void CDllTestDlg::OnBtnAdd() //点击按钮,显示5+3的值
{
// TODO: Add your control notification handler code here HINSTANCE hInst;
hInst = LoadLibrary("Dll2.dll");
typedef int (* ADDPROC)(int a,int b);
ADDPROC Add = (ADDPROC) GetProcAddress(hInst,"add"); if(!Add)
{
MessageBox("获取函数地址失败!");
return ;
}
CString str;
str.Format("5+3=%d",Add(5,3));
MessageBox(str);
FreeLibrary(hInst);
}这是其中的一种使用方式,lz看一下吧。
void CDllTestDlg::OnBtnAdd()
{
// TODO: Add your control notification handler code here HINSTANCE hInst;
hInst = LoadLibrary("Dll2.dll");
typedef int (* ADDPROC)(int a,int b);
ADDPROC Add = (ADDPROC) GetProcAddress(hInst,"add"); if(!Add)
{
MessageBox("获取函数地址失败!");
return ;
}
CString str;
str.Format("5+3=%d",Add(5,3));
MessageBox(str);
FreeLibrary(hInst);
}这是使用.dll的一种方式,要把导出的Dll2.dll放在要使用的工程下,lz看一下吧
LIB文件用于DLL的静态调用,里面的符号跟def文件没联系,也就是说里面的符号还是经过编译器改编过的,和头文件配合使用