Si vous voulez simplement C les exportations, l'utilisation d'un projet C pas du C++. C++ Dll de s'appuyer sur le nom du modificateur pour tous le C++smsi (espaces de noms, etc...). Vous pouvez compiler votre code C en allant dans les paramètres de votre projet sous C/C++->Avancé, il y a une option "Compiler" qui cooresponds pour les commutateurs de compilateur /TP et /TC.
Exportation/Importation DLL Libs dans VC++
Ce que vous voulez vraiment faire est de définir une condition de macro dans un en-tête qui sera inclus dans tous les fichiers source de votre projet DLL:
#ifdef LIBRARY_EXPORTS
# define LIBRARY_API __declspec(dllexport)
#else
# define LIBRARY_API __declspec(dllimport)
#endif
Puis sur une fonction que vous voulez être exportés vous utilisez LIBRARY_API
:
LIBRARY_API int GetCoolInteger();
Dans votre bibliothèque de construction du projet créer un définissent LIBRARY_EXPORTS
ce sera la cause de vos fonctions d'exporter votre fichier DLL construire.
Depuis LIBRARY_EXPORTS
ne sera pas dans un projet de consommer de la DLL, lorsque ce projet inclut le fichier d'en-tête de votre bibliothèque, toutes les fonctions seront importés à la place.
Si votre bibliothèque est d'être multi-plateforme, vous pouvez définir LIBRARY_API que rien lorsqu'il n'est pas sur Windows:
#ifdef _WIN32
# ifdef LIBRARY_EXPORTS
# define LIBRARY_API __declspec(dllexport)
# else
# define LIBRARY_API __declspec(dllimport)
# endif
#elseif
# define LIBRARY_API
#endif
Lors de l'utilisation de dllexport/dllimport vous n'avez pas besoin d'utiliser DEF fichiers, si vous utilisez DEF fichiers que vous n'avez pas besoin d'utiliser dllexport/dllimport. Les deux méthodes d'accomplir la même tâche de différentes manières, je crois que dllexport/dllimport est la méthode recommandée.
L'exportation de unmangled les fonctions d'une DLL C++ pour LoadLibrary/PInvoke
Si vous avez besoin d'utiliser la fonction LoadLibrary et GetProcAddress, ou peut-être faire PInvoke .NET, vous pouvez utiliser extern "C"
en ligne avec votre dllexport. Et puisque nous sommes à l'aide de GetProcAddress au lieu de dllimport nous n'avons pas besoin de faire la ifdef de danse à partir de ci-dessus, juste un simple dllexport:
Le Code:
#define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport)
EXTERN_DLL_EXPORT int getEngineVersion() {
return 1;
}
EXTERN_DLL_EXPORT void registerPlugin(Kernel &K) {
K.getGraphicsServer().addGraphicsDriver(
auto_ptr<GraphicsServer::GraphicsDriver>(new OpenGLGraphicsDriver())
);
}
Et voici ce que les exportations ressemble avec Dumpbin /exportations de:
Dump of file opengl_plugin.dll
File Type: DLL
Section contains the following exports for opengl_plugin.dll
00000000 characteristics
49866068 time date stamp Sun Feb 01 19:54:32 2009
0.00 version
1 ordinal base
2 number of functions
2 number of names
ordinal hint RVA name
1 0 0001110E getEngineVersion = @ILT+265(_getEngineVersion)
2 1 00011028 registerPlugin = @ILT+35(_registerPlugin)
Donc, ce code fonctionne:
m_hDLL = ::LoadLibrary(T"opengl_plugin.dll");
m_pfnGetEngineVersion = reinterpret_cast<fnGetEngineVersion *>(
::GetProcAddress(m_hDLL, "getEngineVersion")
);
m_pfnRegisterPlugin = reinterpret_cast<fnRegisterPlugin *>(
::GetProcAddress(m_hDLL, "registerPlugin")
);