使用 __declspec(dllexport) 从 class 创建对象
Creating object from class with __declspec(dllexport)
//file.h
# define PartExport __declspec(dllexport)
namespace Part{
class PartExport MyClass : public data::anotherClass{
MyClass();
void read();
};
}
我想通过以下操作访问此功能。 Visual studio 建议执行 "Part::read();" 和 f12 以实现该功能。
//main.cpp
#include <file.h>
int main(){
Part::read();
return 0;
}
但是在编译时它会抱怨语法错误,因为它认为 PartExport 是 class 名称。如何访问此函数或创建 MyClass 的对象?
编辑:我意识到 class 上的所有语法错误都来自 #include 。我不知道那是什么意思
你的 class MyClass
是导出的,因此你应该在你的 main 中写 :
Part::MyClass myClass;
myClass.read();
如果你想像在 main 中那样调用你的函数,你应该在 file.h
中这样写:
namespace Part{
void PartExport read();
}
但在这种情况下,您将失去 class 封装。
另一件事:要创建您的 dll,您必须指定 __declspec(dllexport)
以导出库中的函数。
但是当你使用它时,你不应该告诉你的可执行文件你想要导出这个函数,因为它已经导出到你的库中。
我建议您在项目中编译定义此宏的 dll:PART_EXPORT_DLL
然后在你的file.h
中这样写:
//file.h
#ifdef PART_EXPORT_DLL
# define PartExport __declspec(dllexport)
#else
# define PartExport __declspec(dllimport)
#endif
namespace Part{
class PartExport MyClass : public data::anotherClass{
MyClass();
void read();
};
}
并且当您要导入它时,确保不要定义PART_EXPORT_DLL
您要访问的不是函数,而是成员函数。
因此,您必须指定它是哪个 class 的成员。
并且由于您没有将其声明为静态(这会使它类似于一个函数),您甚至必须先实例化一个 MyClass,然后才能访问它。 (非静态函数有一个 'this' 指针,没有你的 class 的实例就不会有 'this')
命名空间 'Part' 只是 class 的另一个包装器。
要访问命名空间中的内容,您可以这样做:
Part::somethinginmynamespace
要调用命名空间中的函数,您可以
Part::somefunction();
要访问您使用的静态成员函数
Part::SomeClass::SomeStaticFunction();
要访问非静态成员函数,您可以:
Part::Someclass myinstance;
myInstance.myFunction();
如果您在定义上遇到错误,并且编译器认为它是一个 class 名称,那么该定义是未定义的。
也许你把它放在评论中,或者 upper/lowercase 是错误的。
//file.h
# define PartExport __declspec(dllexport)
namespace Part{
class PartExport MyClass : public data::anotherClass{
MyClass();
void read();
};
}
我想通过以下操作访问此功能。 Visual studio 建议执行 "Part::read();" 和 f12 以实现该功能。
//main.cpp
#include <file.h>
int main(){
Part::read();
return 0;
}
但是在编译时它会抱怨语法错误,因为它认为 PartExport 是 class 名称。如何访问此函数或创建 MyClass 的对象?
编辑:我意识到 class 上的所有语法错误都来自 #include 。我不知道那是什么意思
你的 class MyClass
是导出的,因此你应该在你的 main 中写 :
Part::MyClass myClass;
myClass.read();
如果你想像在 main 中那样调用你的函数,你应该在 file.h
中这样写:
namespace Part{
void PartExport read();
}
但在这种情况下,您将失去 class 封装。
另一件事:要创建您的 dll,您必须指定 __declspec(dllexport)
以导出库中的函数。
但是当你使用它时,你不应该告诉你的可执行文件你想要导出这个函数,因为它已经导出到你的库中。
我建议您在项目中编译定义此宏的 dll:PART_EXPORT_DLL
然后在你的file.h
中这样写:
//file.h
#ifdef PART_EXPORT_DLL
# define PartExport __declspec(dllexport)
#else
# define PartExport __declspec(dllimport)
#endif
namespace Part{
class PartExport MyClass : public data::anotherClass{
MyClass();
void read();
};
}
并且当您要导入它时,确保不要定义PART_EXPORT_DLL
您要访问的不是函数,而是成员函数。 因此,您必须指定它是哪个 class 的成员。
并且由于您没有将其声明为静态(这会使它类似于一个函数),您甚至必须先实例化一个 MyClass,然后才能访问它。 (非静态函数有一个 'this' 指针,没有你的 class 的实例就不会有 'this')
命名空间 'Part' 只是 class 的另一个包装器。
要访问命名空间中的内容,您可以这样做:
Part::somethinginmynamespace
要调用命名空间中的函数,您可以
Part::somefunction();
要访问您使用的静态成员函数
Part::SomeClass::SomeStaticFunction();
要访问非静态成员函数,您可以:
Part::Someclass myinstance;
myInstance.myFunction();
如果您在定义上遇到错误,并且编译器认为它是一个 class 名称,那么该定义是未定义的。 也许你把它放在评论中,或者 upper/lowercase 是错误的。