ComPtr<ID3D11Device> 到 IntPtr

ComPtr<ID3D11Device> to IntPtr

我在 C++ 方面绝对是零。但是我需要写一个小的 c++ class 来管理 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???
    }
}

我如何 return 来自 C++ 代码的 IntPtr;那么,如何从 ComPtr < ID3D11Device > 获取 IntPtr?

[已编辑]

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

我尝试实现 Rook 编写的内容,但我不明白它对我的场景有何用处。我的意思是它可能有用,但无论如何我都需要从 C++ 项目传递 IDirect3DDevice 对象。

我怀疑您需要做的是阅读文档以了解此类内容:http://microsoft.github.io/Win2D/html/M_Microsoft_Graphics_Canvas_CanvasDevice_CreateFromDirect3D11Device.htm

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

这里要注意 m_device 的范围和生命周期,因为您不希望它的引用计数在 Getd3Device return 和 ComPtr 时递减超出范围。我假设它实际上是 class 的一部分,它将照顾它的生命周期,但它需要重复以防万一。

我今天一直在尝试访问 unity3d 设备。这就是我将指针传回 unity/managed 代码的方式:

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 插件文件夹)