我正在编写一个C/C++ DLL,并希望导出在使用像这样的.def文件之前完成的某些功能。
LIBRARY "MyLib"
EXPORTS
Foo
Bar
使用这样定义的代码,例如:
int Foo(int a);
void Bar(int foo);
但是,如果我想像下面这样声明Foo()的重载方法,该怎么办:
int Foo(int a, int b);
由于def文件仅具有函数名称,而没有完整的原型(prototype),因此我看不到它将如何处理重载的函数。您是否只使用一个条目,然后在将正确原型(prototype)的函数指针传递给LoadLibrary()时指定所需的重载版本?
编辑:要清楚,这是在Windows上使用Visual Studio 2005
编辑:将非def(__declspec)方法标记为答案...我知道这实际上并不能解决我想要的使用def文件的问题,但是似乎没有使用def文件的(官方)解决方案。但是,如果有人知道我们没有重载的函数和def文件,这将使问题悬而未决。
最佳答案
在代码本身中,使用__declspec(dllexport)标记要导出的函数。例如:
#define DllExport __declspec(dllexport)
int DllExport Foo( int a ) {
// implementation
}
int DllExport Foo( int a, int b ) {
// implementation
}
如果这样做,则无需在.def文件中列出功能。
或者,您可以使用默认参数值,例如:
int Foo( int a, int b = -1 )
假定存在一个b值,您可以使用该值指示未使用。如果-1是b的合法值,或者没有默认值或不应该使用默认值,则此功能将无效。
编辑(Adam Haile):更正了使用__declspec的错误,因为__dllspec是不正确的,因此我可以将其标记为正式答案...它已经足够接近了。
编辑(Graeme):糟糕-感谢您纠正我的错字!