2015-11-03 7 views
3

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

class BufferCppBinding { 
public: 

    virtual void construct(); 
}; 

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

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.

+0

Должно ли ваше объявление в C++ быть в интерфейсе D (BufferCppBindingInterface)? http://dlang.org/cpp_interface.html – TractorPulledPork

ответ

2

Возвращаясь указатели на 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 destroy` а

BTW, нет необходимости возвращаться void* и отбрасывать назад - только возвращение BufferCppBindingInterface от createBufferCppBinding.