1. Export C functions for C or C + + projects
If you are using a DLL written in C that you want to export a function to a C or C + + module, you should use the __cplusplus preprocessor macro to determine the language you are compiling. If used from a C + + language module, these functions are declared with a C link. If you use this technique and provide a header file for your DLL, these functions can be used by C and C + + modules intact.
The following code demonstrates a header file that can be used by C and C + + client applications:
Copy Code code as follows:
MyCFuncs.h
#ifdef __cplusplus
extern "C" {//need to export C interface if
Used by C + + source code
#endif
__declspec (dllimport) void Mycfunc ();
__declspec (dllimport) void Anothercfunc ();
#ifdef __cplusplus
}
#endif
Mycfunc () and Anothercfunc () are exported functions for the C language DLL.
If you need to link a C function to a C + + executable and the function declaration header file does not use the above technique, add the following in the C + + source file to prevent the compiler from modifying the C function name:
Copy Code code as follows:
extern "C"
{
#include "MyCHeader.h"
}
The code tells the compiler that "MyCHeader.h" is written in C and does not modify the C function name in the header file, otherwise the connection will not be found.
2. Export C + + functions for C language Project
If you have a function in a DLL written in C + + that you want to access from the C language module, you should declare these functions by using C links instead of C + + links. Unless otherwise specified, the C + + compiler uses the C + + type security naming convention (also known as name Decoration) and the C + + calling convention (which can be difficult to invoke from C using this calling convention).
To specify a c link, specify extern "C" for the function declaration in the DLL. For example:
Copy Code code as follows:
extern "C" __declspec (dllexport) int MyFunc (long parm1);
In the C language function is not directly called C + + code, if you want to invoke, you can do a wrapper, such as Call_lib_cppfunction, its declaration and implementation are as follows:
Copy Code code as follows:
wrapper function
extern "C" void Call_lib_cppfunction (lib* p, dataattribute* dataattribute)
{
P->dafun (Dataattribute);
}
Dafun is the implementation of our C + + code
void Lib::d afun (dataattribute* dataattribute)
{
Map<string, mmsinfo>::iterator it;
// ...
}