C ++ to D совместимость

С тех пор я пытаюсь вызвать некоторый D-код из C ++ (с классом / интерфейсом, определенным для C ++ и D).

код D

module BufferCppBinding;

extern (C++) void *createBufferCppBinding() {
BufferCppBinding ptr = new BufferCppBinding();
return cast(void*)ptr;
}

extern (C++) interface BufferCppBindingInterface {
void construct();
// ...
}

class BufferCppBinding : BufferCppBindingInterface {
public Buffer thisPtr;

public extern (C++) void construct() {
// doesn't do anything
}
}

код C ++ для объявления типа в C ++ land:

class BufferCppBinding {
public:

virtual void construct();
};

для инициализации среды выполнения D я написал небольшую функцию в D, которая выполняет в D land:

extern (C++) void initDRuntime() nothrow{
try
{
Runtime.initialize();
//result = myWinMain(hInstance, hPrevInstance, lpCmdLine, iCmdShow);
//Runtime.terminate(&exceptionHandler);
}
catch (Throwable o)
{
//MessageBox(null, o.toString().toUTF16z, "Error", MB_OK | MB_ICONEXCLAMATION);
//result = 0;
}
}

использование (C ++):

BufferCppBinding *vertexBuffer = reinterpret_cast<BufferCppBinding*>(createBufferCppBinding());

// here happens the crash
vertexBuffer->construct();

Я компилирую код с g ++ 5.2 и ldc2 и связываю его с ldc2.

Я просто получаю SIGSEGV.

4

Решение

Возвращение указателей на C ++, которые указывают на кучу GC, — плохая идея — используйте malloc/emplace (или же std.experimental.allocator.make) instead and callсвободноon the C++ side. That won't run destructors though, so maybe you want to expose a D function that callsуничтожить тоже.

Кстати, не нужно возвращаться void* и отбросить — просто вернуть BufferCppBindingInterface от createBufferCppBinding,

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector