none
动态链接库的函数在其他工程调用的问题 RRS feed

  • 问题

  • 我们在其他的工程调用dll中的函数的时候通常要在文件头部声明

    __declspec (dllimport)INT CUSMessageBox(HWND hwndParent,LPWSTR info);

    我在工程是声明了,但是有个link error
    肯定是这个函数没有被解析,后来我发现了问题出现的原因
    我扎dll总的函数CUSMessageBox前加上__declspec (dllexport)这个东西就搞定了,
    但是我记得我写过一个void类型的函数却不用这个__declspec (dllexport)声明,不知道为什么。?
    有必要在dll中声明这个函数是“出口"的,在调用工程当中声明这个函数是”进口“的吗,感觉没有这个必要啊
    虽然找到了问题所在但是我的疑问还依旧存在,高手能不能解释解释。

    2011年10月25日 11:39

答案

  • __declspec (dllexport) 是告诉编译DLL的时候到处这些符号。这个设置同样可以在Link命令里设置,或者在链接器.def 文件里设置。

     

    __declspec (dllimport) 在引用的时候,如果不加上,那么VS会多加一个函数封装。仅此而已,所以,如果你在乎这个简单的封装,可以不需要。但是VS建议加上,那就加上,既然使用VS,那就按照她所说的做,这是规则。

     

    • 已建议为答案 Honny_yeyh 2011年10月28日 10:50
    • 已标记为答案 Rob Pan 2011年10月31日 9:25
    2011年10月26日 1:17

全部回复

  • 我只知道这样调用是隐式调用,只能.lib文件和头文件才能调用,dll只能显示调用,可以像你这么调用动态链接库吗?

    2011年10月25日 12:10
  • 不够专业
    2011年10月25日 14:29
  • 不过还是谢谢你了
    2011年10月25日 14:29
  • __declspec (dllexport) 是告诉编译DLL的时候到处这些符号。这个设置同样可以在Link命令里设置,或者在链接器.def 文件里设置。

     

    __declspec (dllimport) 在引用的时候,如果不加上,那么VS会多加一个函数封装。仅此而已,所以,如果你在乎这个简单的封装,可以不需要。但是VS建议加上,那就加上,既然使用VS,那就按照她所说的做,这是规则。

     

    • 已建议为答案 Honny_yeyh 2011年10月28日 10:50
    • 已标记为答案 Rob Pan 2011年10月31日 9:25
    2011年10月26日 1:17