【问题标题】:Access violation when deriving from TObject in a DLL从 DLL 中的 TObject 派生时访问冲突
【发布时间】:2012-07-30 12:28:24
【问题描述】:

看到以下 C++ Builder XE2 中的最小示例导致访问冲突,我感到非常困惑:

在由可执行文件DLL组成的项目中:

Project1.dll / Dummy.h:

class __declspec(dllexport) Dummy : public TObject
{
public:
    __fastcall Dummy();
    __fastcall ~Dummy();
};

Project1.dll / Dummy.cpp:

__fastcall Dummy::Dummy()
: TObject()
{
}

__fastcall Dummy::~Dummy()
{
}

Project2.exe / Unit1.cpp:

__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    Dummy *d = new Dummy; // access violation occurs in constructor
    delete d;
}

使用默认项目选项从头开始创建的两个项目都支持 VCL。如果Dummy 不继承自TObject,则不会发生访问冲突。

我做错了什么?

干杯 亨德里克

【问题讨论】:

  • 也许 DLL 是发布版本,而 Project2 是调试版本,反之亦然?
  • 好主意,但不行。调试和发布版本中的访问冲突。
  • 两个项目的Project Options > Linker > Use dynamic RTLProject Options > Packages > Build with runtime packages 的状态如何?
  • 两个项目:Link with dynamic RTL = true,Build with runtime packages = true,并且运行时包列表似乎包含了我系统上安装的所有包
  • 您可以尝试取消选中 DLL 和项目的 link with dynamic RTL 并重建它吗?

标签: dll c++builder


【解决方案1】:

如果您将__declspec(dllexport) 替换为PACKAGE,则上述代码有效。

我已经在各种项目配置中对此进行了测试,它似乎有所作为 - 不再崩溃。但是,我无法再延迟加载 DLL。

在我看来就像一个 C++ Builder 错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多