Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在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 - Fatal编程技术网

如何在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++函数:< /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-

使用以下C#代码:

我试图用以下代码调用它:

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