Я пытаюсь защитить некоторый код C ++ путем экспорта в виде DLL (в Windows / VS 2010).
В приведенном ниже примере в конструкторе суперкласса установлено значение var
, а отладчик показывает, чтоопределенно установлен на ссылку что-то .
. Тест создается в коде, который использует DLL, в которой содержится класс теста.
Но когда go
вызывается изэкземпляр теста (вызывается из DLL, но вызывающий метод вызывается потребителем DLL) var
- нулевой указатель (его значение равно 0).
Это упрощение, так как мне не разрешеночтобы поделиться реальным кодом.
//Headers
class Base {
public:
__declspec(dllexport) Base();
private:
Foo* var;
};
class Test : Base {
public:
__declspec(dllexport) Test();
__declspec(dllexport) void go();
private:
};
//Body
Base::Base() {
var = new Foo();
}
Test::Test() : Base() {
}
void Test::go() {
var->do_something();
}
В коде-потребителе заголовок
class Base {
public:
__declspec(dllimport) Base();
};
class Test {
public:
__declspec(dllimport) Test();
__declspec(dllimport) void go();
};
Реальный код намного сложнее, но я был бы признателен, если кто-нибудь может сказать мнесуществуют ли известные ограничения для переменных экземпляра с помощью dllexport, или более вероятно, что я вызываю метод для нулевого указателя для Test, или, возможно, это проблема dllexport и наследования.Этот код работал до того, как я разделил потребительский код и DLL-код был в том же проекте, он сломался только после его разделения: функции dllexporting / dllimporting, которые я хочу представить во втором наборе заголовков, используемых потребителем.