为dll添加.def文件与直接在需要导出的函数定义处指定_declspec( dllexport )有区别吗?如果有是什么区别?
我发现在outdll.c中这样指定:
__declspec( dllexport ) HRESULT DllGetClassObject (REFCLSID rclsid, REFIID riid, void **ppv)
会产生编译错误:
1>------ Build started: Project: outside, Configuration: Debug Win32 ------
1>Compiling...
1>outdll.c
1>d:\outside-cf\outside\outdll.c(19) : error C2375: 'DllGetClassObject' : redefinition; different linkage
1> c:\program files\microsoft visual studio 8\vc\platformsdk\include\objbase.h(833) : see declaration of 'DllGetClassObject'
1>Build log was saved at "file://d:\outside-cf\outside\Debug\BuildLog.htm"
1>outside - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 0 skipped ==========
c2375的解释意思是出错的函数使用的链接指示符与之前声明的不同。
Compiler Error C2375
'function' : redefinition; different linkage
The function is already declared with a different linkage specifier.
objbase.h中声明了DllGetClassObject()函数:
STDAPI DllGetClassObject(IN REFCLSID rclsid, IN REFIID riid, OUT LPVOID FAR* ppv);
而使用.def文件就没有问题。
分享到:
相关推荐
也可以在MinGW上直接调用 pexports mylib.dll > mylib.def (这就是MinGW的方便之处了) 2. 生成lib 需要mylib.dll和mylib.def lib /machine:ix86 /def:mylib.def 这样就会生成mylib.lib和mylib.exp两个文件。(mylib....
此时使用 __declspec(dllexport) 导出 ——不能指定导出序号。 3.如果是 NONAME 或者 C _CDECL 方式导出(比如 DEF 导出,大多数Windows DLL都是这种情况,比如WS2_32等等),则使用#pragma comment(linker, "/...
为所有的类声明加上__declspec(dllexport)关键字,这有这样编译器才能自动为你产生引入库文件(否则你需要自己写.def文件来产生,因为不常用所以在此不再阐述其细节) 对于DLL的用户来讲,类声明就需要用另外一个...
如果使用“__stdcall”调用方式,可能产生C不识别的修饰名,所以设置导出函数时要采用.def文件形式,而不是__declspec(dllexport)形式。后者会进行修饰名转换,C语言无法识别函数。 下面的代码是一个定义文件的示例...
以.def文件(模块定义文件)方式导出函数(非_declspec(dllexport)方式导出函数),VS2010生成动态链接库,详见博文:http://blog.csdn.net/fightingforcv/article/details/41773391
1.生成动态链接库(_declspec(dllexport)方式导出函数) 2.生成动态链接库(以.def文件(模块定义文件)方式导出函数) 3.以加载时动态链接方式调用DLL 4.以运行时动态链接方式调用DLL 5.以模块定义方式(.def文件)...
此时使用 __declspec(dllexport) 导出 ——不能指定导出序号。 3.如果是 NONAME 或者 C _CDECL 方式导出(比如 DEF 导出,大多数Windows DLL都是这种情况,比如WS2_32等等),则使用#pragma comment(linker, "/...
#define DLL_API extern "C" _declspec(dllexport) #else #define DLL_API extern "C" _declspec(dllimport) #endif #ifdef __cplusplus extern "C" { #endif DECLDIR int __stdcall InitKpHttp(void); ...
将原DLL中无法访问到的函数暴露出来供上层应用调用.##封装中的要点__declspec(dllexport) 表明函数为导出函数* `extern "C"` 导出的函数名与声明一致,否则导出函数名无法正常使用 当然,也可以通过定义`.def`文件实现...
内容索引:VC/C++源码,界面编程,动态链接库 ... 如何使用关键字_declspec (dllexport)导出函数 如何显式链接DLL 如何隐式链接DLL 如何在DLL中共享数据 如何在MFC扩展DLL中导出类 如何在DLL中使用对话框资源
#define KERNEL_ENGINE_CLASS _declspec(dllexport) #else #define KERNEL_ENGINE_CLASS _declspec(dllimport) #endif #endif //模块定义 #ifndef _DEBUG #define KERNEL_ENGINE_DLL_NAME TEXT(...
#define KERNEL_ENGINE_CLASS _declspec(dllexport) #else #define KERNEL_ENGINE_CLASS _declspec(dllimport) #endif #endif //模块定义 #ifndef _DEBUG #define KERNEL_ENGINE_DLL_NAME TEXT(...
#define KERNEL_ENGINE_CLASS _declspec(dllexport) #else #define KERNEL_ENGINE_CLASS _declspec(dllimport) #endif #endif //模块定义 #ifndef _DEBUG #define KERNEL_ENGINE_DLL_NAME TEXT(...
#define KERNEL_ENGINE_CLASS _declspec(dllexport) #else #define KERNEL_ENGINE_CLASS _declspec(dllimport) #endif #endif //模块定义 #ifndef _DEBUG #define KERNEL_ENGINE_DLL_NAME TEXT(...
#define KERNEL_ENGINE_CLASS _declspec(dllexport) #else #define KERNEL_ENGINE_CLASS _declspec(dllimport) #endif #endif //模块定义 #ifndef _DEBUG #define KERNEL_ENGINE_DLL_NAME TEXT(...
#define KERNEL_ENGINE_CLASS _declspec(dllexport) #else #define KERNEL_ENGINE_CLASS _declspec(dllimport) #endif #endif //模块定义 #ifndef _DEBUG #define KERNEL_ENGINE_DLL_NAME TEXT(...