DLL def文件导出

wzyzb 2009-12-10 09:46:05
在使用DEF文件导出的dll的程序中,需要声明各个导出的函数吗?
如果需要是使用dll中编译后的函数名(也就是DEF文件中的函数名)吗?如果是那在应用程序中编译的时候会不会再度被修饰?
...全文
271 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzyzb 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 oyljerry 的回复:]
引用 13 楼 wzyzb 的回复:
引用 12 楼 oyljerry 的回复:
引用 8 楼 wzyzb 的回复:
引用 5 楼 oyljerry 的回复:
引用 3 楼 wzyzb 的回复:
引用 1 楼 oyljerry 的回复:
使用了def就会制定导出函数名,从而防止被修饰
使用了def,也还可以申明导出函数
怎么防止被修饰呢? extern "c"? 指定导出函数名是什么意思?

extern C是以C的方式修饰导出函数名
def就是告诉编译器不要修饰..

  是在DLL中不要修饰 那在应用程序中使用的时候也不会修饰吗?

def制定函数名了,应用程序使用的时候,就可以直接用函数名来GetProcAddress
那要是用lib文件静态调用呢?

def主要是用在动态调用,你静态调用lib,直接包含导出dll的h文件,然后就可以调用h中的函数,不用关心函数修饰..
[/Quote]哦
oyljerry 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wzyzb 的回复:]
引用 12 楼 oyljerry 的回复:
引用 8 楼 wzyzb 的回复:
引用 5 楼 oyljerry 的回复:
引用 3 楼 wzyzb 的回复:
引用 1 楼 oyljerry 的回复:
使用了def就会制定导出函数名,从而防止被修饰
使用了def,也还可以申明导出函数
怎么防止被修饰呢? extern "c"? 指定导出函数名是什么意思?

extern C是以C的方式修饰导出函数名
def就是告诉编译器不要修饰..

  是在DLL中不要修饰 那在应用程序中使用的时候也不会修饰吗?

def制定函数名了,应用程序使用的时候,就可以直接用函数名来GetProcAddress
那要是用lib文件静态调用呢?
[/Quote]
def主要是用在动态调用,你静态调用lib,直接包含导出dll的h文件,然后就可以调用h中的函数,不用关心函数修饰..
wocow3 2009-12-10
  • 打赏
  • 举报
回复
DEF主要是用于DLL的动态调用的,可以使得导出函数按你的意愿具有好的“可读性”,这样GetProcAddress时也看着比较舒服;
LIB文件用于DLL的静态调用,里面的符号跟def文件没联系,也就是说里面的符号还是经过编译器改编过的,和头文件配合使用
wzyzb 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 mmilmf 的回复:]
C/C++ codevoid CDllTestDlg::OnBtnAdd()//点击按钮,显示5+3的值{// TODO: Add your control notification handler code here
HINSTANCE hInst;
hInst= LoadLibrary("Dll2.dll");
typedefint (* 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看一下吧。

[/Quote] 这是动态调用吧 假如用静态调用呢?
wzyzb 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 oyljerry 的回复:]
引用 8 楼 wzyzb 的回复:
引用 5 楼 oyljerry 的回复:
引用 3 楼 wzyzb 的回复:
引用 1 楼 oyljerry 的回复:
使用了def就会制定导出函数名,从而防止被修饰
使用了def,也还可以申明导出函数
怎么防止被修饰呢? extern "c"? 指定导出函数名是什么意思?

extern C是以C的方式修饰导出函数名
def就是告诉编译器不要修饰..

  是在DLL中不要修饰 那在应用程序中使用的时候也不会修饰吗?

def制定函数名了,应用程序使用的时候,就可以直接用函数名来GetProcAddress
[/Quote]那要是用lib文件静态调用呢?
oyljerry 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wzyzb 的回复:]
引用 5 楼 oyljerry 的回复:
引用 3 楼 wzyzb 的回复:
引用 1 楼 oyljerry 的回复:
使用了def就会制定导出函数名,从而防止被修饰
使用了def,也还可以申明导出函数
怎么防止被修饰呢? extern "c"? 指定导出函数名是什么意思?

extern C是以C的方式修饰导出函数名
def就是告诉编译器不要修饰..

  是在DLL中不要修饰 那在应用程序中使用的时候也不会修饰吗?
[/Quote]
def制定函数名了,应用程序使用的时候,就可以直接用函数名来GetProcAddress
mmilmf 2009-12-10
  • 打赏
  • 举报
回复

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看一下吧
mmilmf 2009-12-10
  • 打赏
  • 举报
回复

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看一下吧。
zoulie 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wzyzb 的回复:]
引用 1 楼 oyljerry 的回复:
使用了def就会制定导出函数名,从而防止被修饰
使用了def,也还可以申明导出函数
怎么防止被修饰呢? extern "c"? 指定导出函数名是什么意思?
[/Quote]
extern "C"是为了实现C++与C及其它语言的混合编程,使编译器对函数的编译采用C方式
可以用.DEF防止函数名被修饰
wzyzb 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 oyljerry 的回复:]
引用 3 楼 wzyzb 的回复:
引用 1 楼 oyljerry 的回复:
使用了def就会制定导出函数名,从而防止被修饰
使用了def,也还可以申明导出函数
怎么防止被修饰呢? extern "c"? 指定导出函数名是什么意思?

extern C是以C的方式修饰导出函数名
def就是告诉编译器不要修饰..
[/Quote]
是在DLL中不要修饰 那在应用程序中使用的时候也不会修饰吗?
wzyzb 2009-12-10
  • 打赏
  • 举报
回复
通过导出函数的序号怎么调用函数呢?
hzy694358 2009-12-10
  • 打赏
  • 举报
回复
没关系的,其实只要dll能用就可以了,
oyljerry 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wzyzb 的回复:]
引用 1 楼 oyljerry 的回复:
使用了def就会制定导出函数名,从而防止被修饰
使用了def,也还可以申明导出函数
怎么防止被修饰呢? extern "c"? 指定导出函数名是什么意思?
[/Quote]
extern C是以C的方式修饰导出函数名
def就是告诉编译器不要修饰..
wzyzb 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mmilmf 的回复:]
C/C++ codeint add(int a,int b)
{return a+ b ;
}int subtract(int a,int b)
{return a- b ;
}
这段代码写于.cpp中
C/C++ code

LIBRARY Dll2//.dll名
EXPORTS
add
subtract
这段代码写于.def中
这样导出的函数就是add和subtract函数啦
[/Quote]
请问你这样在程序中怎么使用,能不能在给个例子
wzyzb 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 oyljerry 的回复:]
使用了def就会制定导出函数名,从而防止被修饰
使用了def,也还可以申明导出函数
[/Quote] 怎么防止被修饰呢? extern "c"? 指定导出函数名是什么意思?
mmilmf 2009-12-10
  • 打赏
  • 举报
回复

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函数啦
oyljerry 2009-12-10
  • 打赏
  • 举报
回复
使用了def就会制定导出函数名,从而防止被修饰
使用了def,也还可以申明导出函数

15,471

社区成员

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

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