日期:2014-05-18  浏览次数:21266 次

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一样