C++结构转C#结构遇到
尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
C++ DLL中的结构:
typedef struct
{
LONG cfHeight; //字符高度
LONG cfWidth; //字符宽度
LONG cfWeight; //字符粗细
LONG cfSpacing; //字符间距
BOOL cfItalic; //斜体
BOOL cfUnderline; //下划线
BOOL cfStrikeOut; //删除线
BOOL bTransparent; //透明
COLORREF cfBkColor; //背景色
COLORREF cfTextColor; //前景色
TCHAR cfFaceName[32]; //字体名
}OSDPARAM;
转成C#:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct OSDPARAM
{
public Int32 cfHeight; //字符高度
public Int32 cfWidth; //字符宽度
public Int32 cfWeight; //字符粗细
public Int32 cfSpacing; //字符间距
public bool cfItalic; //斜体
public bool cfUnderline; //下划线
public bool cfStrikeOut; //删除线
public bool bTransparent; //透明
public Color cfBkColor; //背景色
public Color cfTextColor; //前景色
public Font cfFaceName;
}
函数VCASetVidCapDateTimeOSDParam(m_pDev[1].stuOSDPARAM[0].OSDParam);使用OSDPARAM结构报异常:
结构转C#结构遇到尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
查了很多资料都没有结果哦?////!
------解决方案--------------------
你的Color和Font定义是使用.NET Framwork的定义吗?这个10有89有问题。
.NET下的对象直接列集应该不会和Native的代码兼容的,你应该自己写 Color和Font的定义。
------解决方案--------------------COLORREF 这个是个int,至于如何转换,看下面
http://www.west263.com/www/info/35183-1.htm
TCHAR这个我建议你搞成byte[]类型的,再根据需要用System.Text.Encoding里面的编码转换器来GetString
------解决方案--------------------我现在怀疑你可能要这么做:
先把cfFaceName声明成Int(或者IntPtr)
接着用Marshal.AllocHGlobal分配一个64字节的内存
接着把cfFaceName指向AllocHGlobal返回的那个 IntPtr(其实就是个指针),然后再传入
这里麻烦就麻烦在你的TCHAR,究竟你是算作char(C++里的char),还是wchar_t来用
如果你是char,.NET里面就是byte[], 如果你是wchar_t, .NET里是char[]
------解决方案--------------------还要提示一句就是你AllocHGlobal之后记得Marshal.FreeHGlobal ,其实就像C++你new了要delete一样