读书人

C++结构转C#结构遇到尝试读取或写入受

发布时间: 2012-02-29 16:44:11 作者: rapoo

C++结构转C#结构遇到尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
C++ DLL中的结构:
typedef struct
{
LONGcfHeight;//字符高度
LONGcfWidth;//字符宽度
LONGcfWeight;//字符粗细
LONGcfSpacing;//字符间距
BOOLcfItalic;//斜体
BOOLcfUnderline;//下划线
BOOLcfStrikeOut;//删除线
BOOLbTransparent; //透明
COLORREFcfBkColor;//背景色
COLORREFcfTextColor;//前景色
TCHARcfFaceName[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一样

读书人网 >C#

热点推荐