2016-02-29 25 views
-2

我是C++的絕對零。但我需要編寫一個用於管理d3ddevice的小型C++類。 我C#代碼是:ComPtr <ID3D11Device>到IntPtr

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 < ID3D11Device>?

[編輯]

我在做什麼是... 我在我的C#項目win2d canvasandimatedcontrol。我想使用sharpdx在其中繪製direct3d對象。但我發現我需要從win2d畫布獲得d3ddevice對象。並沒有一個C#方法來獲取它。 所以我能想象的唯一解決方案是構建一個簡單的C++項目,我可以通過canvas控件並獲取d3ddevice。唯一的問題是如何將d3d設備傳遞迴c#。夏普DX似乎只有一個方法Device.FormIntPtr來創建它。但我無法將intptr傳回給c#對象。

我試圖實現Rook寫的內容,但我無法理解它對我的場景如何有用。我的意思是它可能是有用的,但我仍然需要從C++項目中傳遞IDirect3DDevice對象。

+0

如果我的答案不充分,你可以這樣說,它可能會改變。如果有幫助,您應該考慮將其標記爲已接受。 – Rook

+0

對不起,以前沒有重放,但我仍然在尋找一種方法去做我的意思。你的回答並不充分。這是有益的閱讀更多關於論點... – puckkk

+0

@Rook在原帖中增加了信息:) – puckkk

回答

0

我懷疑你需要做的是閱讀的文檔這樣的事情:http://microsoft.github.io/Win2D/html/M_Microsoft_Graphics_Canvas_CanvasDevice_CreateFromDirect3D11Device.htm

CanvasDevice實現ICanvasResourceCreator,所以你可以一旦你使用靜態工廠方法創建它直接返回。

請注意這裏m_device的範圍和使用期限,因爲當Getd3Device返回並且ComPtr超出範圍時,您不希望其遞減計數減小。我假設它實際上是一個會照顧其生命週期的類的一部分,但它爲了以防萬一。

+0

接受;但沒有幫助.. – puckkk

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複製到統一插件n文件夾)