如何在C#中整理尺寸结构? 我试图让下面的C++函数:< /P> STDMETHODIMP CPushSource::SetSize(SIZE *pSize) { CMutexLock lock(&m_csShared); CheckPointer(pSize, E_POINTER); m_iImageWidth = pSize->cx; m_iImageHeight = pSize->cy; saveSettings(); return S_OK; }
使用以下C#代码: 我试图用以下代码调用它:如何在C#中整理尺寸结构? 我试图让下面的C++函数:< /P> STDMETHODIMP CPushSource::SetSize(SIZE *pSize) { CMutexLock lock(&m_csShared); CheckPointer(pSize, E_POINTER); m_iImageWidth = pSize->cx; m_iImageHeight = pSize->cy; saveSettings(); return S_OK; },c#,c++,interop,com-interop,C#,C++,Interop,Com Interop,使用以下C#代码: 我试图用以下代码调用它: m_desktopFilter.SetSize(new Size(320,240)); 我对这种C++/C#interop的东西有点陌生,所以任何能为我指出正确方向的人都会非常感激 另外,我得到的错误是: 试图读取或写入受保护的内存。这通常表示其他内存已损坏 这是我尝试为DirectShow过滤器设计的一个简单包装器,如果这很重要的话。该滤波器为SCFH-DSF 我也试过了 [ComImport, Guid("1b1afbaf-cb92-42da-
m_desktopFilter.SetSize(new Size(320,240));
我对这种C++/C#interop的东西有点陌生,所以任何能为我指出正确方向的人都会非常感激
另外,我得到的错误是:
试图读取或写入受保护的内存。这通常表示其他内存已损坏
这是我尝试为DirectShow过滤器设计的一个简单包装器,如果这很重要的话。该滤波器为SCFH-DSF
我也试过了
[ComImport, Guid("1b1afbaf-cb92-42da-8307-5a7be8c2b4b0")]
public interface ISCFHSettings
{
[PreserveSig]
int SetSize([In, MarshalAs(UnmanagedType.Struct)] MySize size);
}
[StructLayout(LayoutKind.Sequential)]
public struct MySize
{
public int cx;
public int cy;
}
在调用代码中
MySize sz = new MySize();
sz.cx = 320;
sz.cy = 240;
m_desktopFilter.SetSize(sz);
这对我也不起作用
[ComImport, Guid("1b1afbaf-cb92-42da-8307-5a7be8c2b4b0")]
public interface ISCFHSettings
{
[PreserveSig]
int SetSize(ref MySize size);
}
签名中的[marshallas(UnmanagedType.Struct)]
不正确。函数需要一个指向大小的指针,因此您需要定义它(正如您所做的那样),并在不使用其他编组属性的情况下通过引用传递它
我希望您应该这样定义接口:
[ComImport, Guid("1b1afbaf-cb92-42da-8307-5a7be8c2b4b0")]
public interface ISCFHSettings
{
int SetSize(MySize size);
}
[marshallas(UnmanagedType.Struct)]
实际上与变量
编组相关,但名称不正确。如前所述,您应该能够使用ref
使其工作,但由于您仍然有问题,这里有一个最小的完整程序可以工作。你可以扩展到你想要的东西
C#:
VC++:
我感觉C++中的大小结构与C++函数所期望的结构不同,因此,你可能需要在C++中用C++所期望的精确字段创建一个显式结构。我将以那个尝试结束。用那个代码更新,同样的错误。marshallas(UnmanagedType.Struct)
看起来不正确。你的C++函数取一个指针,而不是一个结构。你能试着把size
设为ref
参数吗?哦,事实上,更糟的是:根据文档,MarshalAs(UnmanagedType.Struct)
实际上与结构没有任何关系……对不起,Martin,我是个新手,你能解释一下如何通过引用传递吗?@j_mcnally正如我在对你的问题的评论中提到的,使用ref
:int SetSize(ref MySize size)
(根据需要添加属性),然后也使用ref
调用它:var size=new size(320240);m_desktopFilter.SetSize(参考尺寸)
@hvd我已经用更多仍然抛出相同错误的代码更新了我的问题。谢谢,martin,这不是同一个内存损坏错误。我现在试过有裁判和没有裁判。什么都不管用,我希望有其他想法。
[ComImport, Guid("1b1afbaf-cb92-42da-8307-5a7be8c2b4b0")]
public interface ISCFHSettings
{
int SetSize(MySize size);
}
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace ConsoleApplication1
{
public struct mySize
{
public int x, y;
}
static class Program
{
[DllImport("ClassLibrary.dll")]
static extern int getX(ref mySize size);
static void Main(string[] args)
{
var size = new mySize { x=100, y=200 };
int x = getX(ref size);
Debug.Assert(x == 100);
}
}
}
struct mySize
{
int x, y;
};
extern "C" __declspec(dllexport)
int __stdcall getX(mySize *pSize)
{
return pSize->x;
}