我刚开始学习DLL内容,请帮帮我

arfu 2000-06-27 05:15:00
我刚开始学习DLL内容,有些不懂,
我创建了一个mydll.dll
要声明导出函数,有两种方法:
1。
extern "c" _ _declspec(dlexport) int Myfunction(int n);

请问:
是不是将其加在mydll.h中?那还用不用创建mydll.def了?
如果是加在.h文件中,那在.cpp的实现程序前
用不用加extern "c" _ _declspec(dlexport)?
extern "c" 和 c语言中的扩充作用域功能是两回事吧?

2。
// mydll.def

EXPORTS
Myfunction

请问各位上面两种方法那种比较好,为什么?
...全文
167 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sanhan 2000-06-29
  • 打赏
  • 举报
回复
如果你的源文件扩展名为cxx或者cpp,缺省方式就是C++;
假如你的调用程序扩展名为c,就可能出问题。这时最好加extern "C"

如果dll源文件为.c文件,extern "C"当然不用加。

压栈次序的问题必须考虑。而且最好使用WINAPI声明。否则在很多环境下
无法调用你的dll。

最好不要在头文件中加什么__declspec(dllexport),__declspec(dllimport);
因为你的头文件主要是调用程序用来声明函数原型的,多数情况下,调用程序
不希望知道是调dll还是lib。为保证兼容性,不要这样做。
Kenny 2000-06-29
  • 打赏
  • 举报
回复
1、DEF文件在VC6以前的版本编译器编译DLL时,必须有。VC6用不着。
2、在你的DLL工程中,所有对MyFunction()声明的地方需保持一致。且如果没有DEF文件,__declspec(dllexport)是必需的。
3、如果你想使你的DLL可以用VB、PB、VFP、C中调用,而你的源程序是CPP文件,则extern "C"和WINAPI即__stdcall是必须的。
4、调用时的声明和DLL工程中的声明除__declspec(dllexport)外需保持一致。
jy 2000-06-28
  • 打赏
  • 举报
回复
通常情况下,extern "C" 可以完全不加。
加上代表着不论IDE环境如何,这个函数的调用总是使用C协定;不加呢,则一般是C协定,但也可能使用PASCAL协定,视你的环境如何配置而定。
两种协定的区别主要在于参数的压栈顺序上,一般可以不考虑。
jy 2000-06-28
  • 打赏
  • 举报
回复
不是,__declspec(dllexport)应该在头文件中申明。保证正确引出符号,这个作用和2.中相同,但更方便。
当在其他的计划中使用时,__declspec(dllimport)用于告诉其他计划应该引入该符号,显然它也应该用在头文件中。

由于上述原因,为了使用同一个头文件mydll.h,使得既用在mydll计划中,同时又能不加修改地用在其他计划中,我推荐的是:
in MyDLL stdafx.h, insert:
#define MY_DLL_PRIVATE

in MyDLL MyDLL.h begin, insert
#ifdef MY__DLL_PRIVATE
# define MY_DLL_CLASS __declspec(dllexport)
#else
# define MY_DLL_CLASS __declspec(dllimport)
# ifdef _DEBUG
# pragma comment(lib, "MyDLLd.lib")
# else
# pragma comment(lib, "MyDLL.lib")
# endif
#endif

这样,在任何需要的地方加入MyDLL.h就行,甚至也通知了Linker自动寻找正确的连接库(注意,我习惯为调试版的DLL以後缀d结束,所以.lib也带有d后缀)。

至于要引出的函数,则可以申明成:
void MY_DLL_CLASS MyFunction(...);

实现成(在cpp中):
void MyFunction(...){
}
jy 2000-06-28
  • 打赏
  • 举报
回复
对不起,考虑时忘了,上一段错了,应该是:


通常情况下,extern "C" 可以完全不加。
加上代表着不论IDE环境如何,这个函数的调用总是使用C协定;不加呢,则一般是C协定,但也可能使用PASCAL协定,或者C++协定,视你的环境如何配置而定。
C和PASCAL协定的区别主要在于参数的压栈顺序上,一般可以不考虑。
C和C++协定基本上是完全一样的,然而C++编译器会为函数的引出符号附加上参数类型的表示字符,而C协定呢,一般就是函数名称前面加上下划线。同样的,现在通常也不必在其中伤脑筋,不加就是。

但如果你的程序会存在比较复杂的开发环境,既有旧的C代码,又有新的C++代码,等等,用extern "C"可以限定快照的一致性。
arfu 2000-06-27
  • 打赏
  • 举报
回复
在mydll.h 中是不是写为 int Myfunction(int n);

在mydll.cpp中是不是写为
extern "c" _ _declspec(dlexport) int Myfunction(int n);

加不加 extern "c" ???
sanhan 2000-06-27
  • 打赏
  • 举报
回复
__declspec(dllexport) 加在函数定义处,不在头文件里。
def文件里最好还是要有函数名。假如你只用VC调这个dll,def里面没有也行。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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