ComPtr <id3d11device>到IntPtr

时间:2016-02-29 10:30:27

标签: c++ direct3d

我在C ++中绝对为零。但是我需要编写一个小的c ++类来管理d3ddevice。 我的 C#代码是:

public class HCPPUtils
{ 
    [DllImport("HSpectrum\\Assets\\HCPPUtils.dll")]
    private static extern int Getd3Device(ICanvasResourceCreator resourceCreator);}
    HCPPUtils hcp = new HCPPUtils();
    var pnt =  hcp.HGetOrCreate(ResourceCreator);
    var d3dDevice = SharpDX.Direct3D11.Device.FromPointer<SharpDX.Direct3D11.Device>(new System.IntPtr(pnt));

我的 C ++代码是:

extern "C"
{
     __declspec(dllexport) int Getd3Device
    (Microsoft::Graphics::Canvas::ICanvasResourceCreator^ canvasDevice)
    {
         ComPtr<ID3D11Device> m_device;
         __abi_ThrowIfFailed(Windows::Graphics::DirectX::Direct3D11::GetDXGIInterface(canvasDevice->Device,m_device.GetAddressOf()));
          return m_device???
    }
}

如何从C ++代码返回IntPtr;那么,我怎样才能从ComPtr获得IntPtr&lt; ID3D11设备&gt;?

[编辑]

我正在做的是...... 我在c#项目中有一个win2d canvasandimatedcontrol。我想使用sharpdx在其中绘制direct3d对象。但我发现我需要从win2d canvas获得d3ddevice对象。而且没有c#方法可以获得它。 因此,我能想象的唯一解决方案是构建一个简单的c ++项目,我可以将其传递给canvas控件并获取d3ddevice。唯一的问题是如何将d3d设备传回c#。 Sharp DX似乎只有一个方法Device.FormIntPtr来创建它。但是我无法将intptr传回c#对象。

我试图实现Rook所写的内容,但我无法理解它对我的场景有何用处。我的意思是它可能是有用的,但无论如何我需要从c ++项目传递IDirect3DDevice对象。

2 个答案:

答案 0 :(得分:0)

我怀疑你需要做的是阅读以下内容的文档:http://microsoft.github.io/Win2D/html/M_Microsoft_Graphics_Canvas_CanvasDevice_CreateFromDirect3D11Device.htm

CanvasDevice实现ICanvasResourceCreator,因此您可以在使用静态工厂方法创建它后直接将其返回。

请注意此处m_device的范围和生命周期,因为当Getd3Device返回且ComPtr超出范围时,您不希望其引用计数递减。我假设它实际上是一个类的一部分,它将照顾它的生命周期,但为了以防万一,它会重复。

答案 1 :(得分:0)

我今天一直试图访问unity3d设备。这就是我将指针传回统一/托管代码的方式:

CPP:

/*
delegate to pass directx device/context back to managed code
see https://forum.unity3d.com/threads/communicating-c-with-c.89930/#post-586885
*/
typedef int(__stdcall *ANSWERCB)(ID3D11Device* ptr);
static ANSWERCB cb;

extern "C" __declspec(dllexport) int GetDevice(ANSWERCB fp)
{
    cb = fp;
    if (cb)
    {
        return cb(s_CurrentAPI->GetDevice());
    }
    return 0;
}

CS:

[DllImport("RenderingPlugin")]
private static extern void GetDevice(Action<IntPtr> callback);
后来我打电话给:

GetDevice(devicePtr =>
{
    Debug.Log(devicePtr);
    if (devicePtr == IntPtr.Zero) return;
    device = SharpDX.Direct3D11.Device.FromPointer<SharpDX.Direct3D11.Device>(devicePtr);

...

在编辑器中工作正常以及新的2017.1 beta版本内置(只要你将必要的64位系统dll复制到unitys插件文件夹)