ComPtr<ID3D11Device> to IntPtr
ComPtr<ID3D11Device> to IntPtr
我在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
[已编辑]
我正在做的是...我的 c# 项目中有一个 win2d 画布和控件。我想使用 sharpdx 在其中绘制 direct3d 对象。但我发现我需要从 win2d 画布中获得 d3ddevice 对象。并且没有 c# 方法来获取它。所以我能想到的唯一解决方案是构建一个简单的 c++ 项目,我可以将画布控件传递给该项目并获取 d3ddevice。唯一的问题是如何将 d3d 设备传回 c#。夏普DX似乎只有一个方法Device.FormIntPtr来创建它。但我无法将 intptr 传回 c# 对象。
我试图实现 Rook 编写的内容,但我无法理解它对我的场景有何用处。我的意思是它可能很有用,但我无论如何都需要从 c++ 项目中传递 IDirect3DDevice 对象。
我怀疑你需要做的是阅读文档,了解这样的事情:http://microsoft.github.io/Win2D/html/M_Microsoft_Graphics_Canvas_CanvasDevice_CreateFromDirect3D11Device.htm
CanvasDevice
实现了ICanvasResourceCreator
,因此一旦使用静态工厂方法创建它,您就可以直接返回它。
请注意此处m_device
的范围和生存期,因为您不希望在返回Getd3Device
并且ComPtr
超出范围时减少其 refcount。我假设它实际上是将照顾其生命周期的类的一部分,但为了以防万一,它值得重复。
我今天一直在尝试访问 unity3d 设备。这就是我将指针传递回 unity/托管代码的方式:
.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测试版中运行良好(只要您将必要的64位系统DLL复制到Unitys插件文件夹)
- "error: no matching function for call to"构造函数错误
- 调用专用模板时出错"no matching function for call to [...]"
- C++ Singleton - Prevent ::instance() to variable
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- Visual Studio Code "undefined reference to `WinMain@16'"
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 如何解决"invalid conversion from 'char' to 'const char*'"
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- Python str to C++ to Python str
- 为什么创建友元类的实例会导致"undefined reference to"错误?
- System.InvalidCastException - SQL to C++ - safe_cast<float>
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- "no matching function for call to 'Vector::Vector'"错误
- vector<vector<double>> to mxArray using memcpy
- Tensorflow c++ api undefined reference to 'tflite::D efaultErrorReporter()'
- 当覆盖存在时调用基本虚拟"binded to object"函数
- OpenGL VBO Indexing ( How to compute Index Array)
- c++ to VB.Net IntPtr Strings
- ComPtr<ID3D11Device> to IntPtr