2016-02-29 1 views
-2

Je suis un zéro absolu en C++. Mais j'ai besoin d'écrire une petite classe C++ pour gérer un d3ddevice. Mon C# Code est: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)); 

Mon C++ Code est:

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

Comment puis-je retourner un IntPtr à partir du code C++; alors, comment puis-je obtenir IntPtr de ComPtr < ID3D11Device>?

[édité]

Ce que je fais est ... J'ai un canvasandimatedcontrol win2d dans mon C# projet. Je veux y dessiner un objet direct3d en utilisant sharpdx. Mais j'ai découvert que j'avais besoin de l'objet d3ddevice de win2d canvas. Et il n'y a pas de méthode C# pour l'obtenir. Donc la seule solution que je puisse imaginer est de construire un simple projet C++ auquel je peux passer le contrôle de canvas et obtenir le d3ddevice. Le seul problème est de savoir comment renvoyer le périphérique d3d à C#. Sharp DX semble avoir juste une méthode Device.FormIntPtr pour le créer. Mais je ne suis pas capable de renvoyer l'intptr à l'objet C#.

J'ai essayé de mettre en œuvre ce que Rook a écrit, mais je ne comprends pas comment cela pourrait être utile pour mon scénario. Je veux dire que ça pourrait être utile, mais je dois quand même passer l'objet IDirect3DDevice d'un projet C++.

+0

Si ma réponse était inadéquate, vous pourriez le dire et cela pourrait être modifié. Si cela vous a été utile, vous devriez envisager de le marquer comme accepté. – Rook

+0

Désolé de ne pas avoir rejoué plus tôt, mais je cherche toujours un moyen de faire ce que je voulais dire. Votre réponse n'était pas inadéquate. Il était utile de lire un peu plus sur l'argument ... – puckkk

+0

@Rook Ajout d'informations dans l'article original :) – puckkk

Répondre

0

je soupçonne que ce que vous devez faire est de lire la documentation pour des choses comme ceci: http://microsoft.github.io/Win2D/html/M_Microsoft_Graphics_Canvas_CanvasDevice_CreateFromDirect3D11Device.htm

CanvasDevice implémente ICanvasResourceCreator, vous pouvez le retourner directement une fois que vous avez créé à l'aide de la méthode d'usine statique. Soyez prudent avec la portée et la durée de vie de m_device ici, parce que vous ne voulez pas que son compteur soit décrémenté quand Getd3Device revient et le sort du champ d'application. Je suppose que cela fait partie d'une classe qui s'occupera de sa durée de vie, mais il vaut la peine de le répéter au cas où.

+0

Accepté; mais pas utile .. – puckkk

0

J'ai essayé d'accéder au dispositif unity3d aujourd'hui. Voici comment je suis passé le pointeur de retour dans l'unité/code managé:

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); 

plus tard, j'appelle:

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

... 

fonctionne très bien dans l'éditeur ainsi que le construit dans la nouvelle version bêta 2017.1 (tant que vous copiez les dlls système 64 bits nécessaires pour les plugins unitys n dossier)