Я пытаюсь защитить некоторый код C++, экспортируя его как DLL (в Windows/VS 2010).
В приведенном ниже примере var
установлен в конструкторе суперкласса, и отладчик показывает, что он определенно установлен для ссылки на что-то.
Тест создается в коде, использующем библиотеку DLL, в которой содержится класс Test.
Но когда 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, которые я хочу представить во втором наборе заголовков, используемых потребителем.