Dll 文件导出方式,Debug/Release简要区别

DLL中导出方式

  • 一种方式是:在函数声明中加上__declspec(dllexport);

  • 另外一种方式是:采用模块定义(.def)文件声明,(.def)文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。
    .def文件的规则为: (1)LIBRARY语句说明.def文件相应的DLL;
    (2)EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加@n,表示要导出函数的序号为n(在进行函数调用时,这个序号将发挥其作用);
    (3).def 文件中的注释由每个注释行开始处的分号 (;) 指定,且注释不能与语句共享一行。
    (4)使用__declspec(dllexport)和使用.def文件是有区别的。
    如果你的DLL是提供给VC用户使用的,你只需要把编译DLL时产生的.lib提供给用户,它可以很轻松地调用你的DLL。但是如果你的DLL是供VB、PB、Delphi用户使用的,那么会产生一个小麻烦。
    因为VC++编译器对于__declspec(dllexport)声明的函数会进行名称转换,如下面的函数:
    __declspec(dllexport) int __stdcall Add() 会转换为Add@0,这样你在VB中必须这样声明: Declare Function Add Lib “DLLTestDef.dll” Alias “Add@0” () As Long
    @后面的数由于参数类型不同而可能不同。这显然不太方便。所以如果要想避免这种转换,就要使用.def文件方式导出函数了。

Debug/Release的简要区别

参考博客http://javafans.iteye.com/blog/609937/

  • debug在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc(注1);
  • Release的赋值近 似于随机(我想是直接从内存中分配的,没有初始化过);
  • 在自定义消息 的函数体声明时,时常会看到这样的写法:afx_msg LRESULT OnMessageOwn();Debug情况下一般不会有任何问题
  • Release下且多线程或进程间使用了消息传递时就会导致无效句柄之类的错误。导致这个错误直接原因是消息体的参数没有添加,即应该写成:
  • afx_msg LRESULT OnMessageOwn(WPARAM wparam, LPARAMlparam);
发布了38 篇原创文章 · 获赞 5 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/zhiyanzhai563/article/details/68927257