使用 __declspec(dllexport) 从类创建对象

Creating object from class with __declspec(dllexport)

本文关键字:创建对象 dllexport declspec 使用      更新时间:2023-10-16
//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 是类名。如何访问此函数或创建 MyClass 的对象?

编辑:我意识到类上的所有语法错误都来自 #include。我不知道这意味着什么

你的类MyClass被导出,因此你应该在你的主:

Part::MyClass myClass;
myClass.read();
如果你想像在

main中实际调用函数一样调用函数,你应该在file.h中写:

namespace Part{
  void PartExport read();
}

但在这种情况下,您将丢失类封装。


另一件事 :要创建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

您要访问的不是函数,而是成员函数。因此,您必须指定它是哪个类的成员。

由于您尚未将其声明为静态,这将使它类似于函数,因此您甚至必须实例化其中一个MyClass才能访问它。(非静态函数有一个"this"指针,没有你的类的实例就没有"this"(

命名空间"Part"只是类的另一个包装器。

要访问命名空间中的某些内容,请执行如下操作:

Part::somethinginmynamespace

要调用命名空间中的函数,请执行以下操作

Part::somefunction();

访问您使用的静态成员函数

Part::SomeClass::SomeStaticFunction();

要访问非静态成员函数,请执行以下操作:

Part::Someclass myinstance;
myInstance.myFunction();

如果您在定义上遇到错误,并且编译器认为它是一个类名,则定义是未定义的。也许你把它放在评论中,或者大写/小写是错误的。