首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

异常“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”

2013-09-28 
错误“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”做的是软件二次开发,提供的DLL文件本来是供C+

错误“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”
做的是软件二次开发,提供的DLL文件本来是供C++二次开发用的,但我使用的编程软件是vb.net

dll文件函数手册(供C++使用的):


typedef struct
{

LONG cfHeight; //字符高度
LONG cfWidth; //字符宽度
LONG cfWeight; //字符粗细
LONG cfSpacing; //字符间距
BOOL cfItalic; //斜体
BOOL cfUnderline;//下划线
BOOL cfStrikeOut;//删除线
BOOL bTransparent;   //透明
COLORREFcfBkColor; //背景色 
COLORREFcfTextColor;//前景色
TCHAR cfFaceName[32];//字体名

}OSDPARAM;
/设置视频捕获时间、日期叠加,在VCASetVidCapDateTimeOSDPARAM()函数设置后调用有效
BOOL  WINAPI VCASetVidCapDateTimeOSD( DWORD dwCard, BOOL bEnableOSD, POINT& ptTopLeft);
//设置视频捕获字幕叠加
BOOL  WINAPI VCASetVidCapDateTimeOSDParam( OSDPARAM* pOSDParm );


vb.net使用该DLL文件:
先将以上代码转为vb.net代码

Public Structure OSDParam
        Dim cfHeight As Long
        Dim cfWidth As Long
        Dim cfWeight As Long
        Dim cfSpacing As Long
        Dim cfItalic As Boolean
        Dim cfUnderline As Boolean
        Dim cfStrikeOut As Boolean
        Dim bTransparent As Boolean
        Dim cfBkColor As Color
        Dim cfTextColor As Color
        Dim cfFaceName() As Byte

End Structure
        '设置视频时间、日期叠加参数
        Declare Function VCASetVidCapDateTimeOSDParam Lib "Sa7134Capture.dll" _
        (ByVal pOSDParam As OSDParam) As Boolean
        '设置视频时间、日期叠加
        Declare Function VCASetVidCapDateTimeOSD Lib "Sa7134Capture.dll" _
        (ByVal dwCard As Long, ByVal bEnableOSD As Long, ByVal ptTopLeft As Point) As Boolean


调用函数:


        Public OsdParameter As OSDParam
        Public OsdTimepoint As Point

'设置录像osd参数(本sdk相关的osd参数只对录像osd生效,预览osd自己来创建)
        OsdParameter.cfHeight = 15    '   //字符高度
        OsdParameter.cfWidth = 12              '   //字符宽度
        OsdParameter.cfWeight = 10             '   //字符粗细
        OsdParameter.cfSpacing = 0               '   //字符间距
        OsdParameter.cfItalic = False            '   //斜体
        OsdParameter.cfUnderline = False         '   //下划线
        OsdParameter.cfStrikeOut = False           '   //删除线
        OsdParameter.bTransparent = True
        OsdParameter.cfBkColor = System.Drawing.Color.FromArgb(255, 255, 255) '   //背景色
        OsdParameter.cfTextColor = System.Drawing.Color.FromArgb(0, 0, 0) '   //前景色
        ReDim OsdParameter.cfFaceName(31)
        OsdParameter.cfFaceName(0) = 0

        OsdTimepoint.X = 10
        OsdTimepoint.Y = 20

        VCASetVidCapDateTimeOSDParam(OsdParameter)
        VCASetVidCapDateTimeOSD(i, 1, OsdTimepoint)


当执行到VCASetVidCapDateTimeOSDParam(OsdParameter)就会出现错误“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”。
一直卡死在这,求大神指教啊!!! structure winapi


[解决办法]
还有

        Declare Function VCASetVidCapDateTimeOSDParam Lib "Sa7134Capture.dll" _
        (ByVal pOSDParam As OSDParam) As Boolean

这里应该是ByRef。

引用:
这句话是加在Public cfFaceName() As Byte前面吗?
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=32)> Public cfFaceName() As Byte
但好像没有什么用啊,debug时发现redim后,cfFaceName的长度才是32

只要保证Marshal.SizeOf(结构)的值和C/C++中sizeof(结构)的值相同即可
[解决办法]
引用:
Quote: 引用:

'设置视频时间、日期叠加 Declare Function VCASetVidCapDateTimeOSD Lib "Sa7134Capture.dll" _ (ByVal dwCard As Long, ByVal bEnableOSD As Long, ptTopLeft As POINT) As Boolean 

'设置视频时间、日期叠加 Declare Function VCASetVidCapDateTimeOSD Lib "Sa7134Capture.dll" _ (ByVal dwCard As Integer, ByVal bEnableOSD As Integer, ptTopLeft As POINT) As Boolean 

另楼主是如何引用的?我下了DLL.引用不了????

嗯,按照你说的改了,但是没用。我执行到VCASetVidCapDateTimeOSDParam(OsdParameter)就开始出错了。

无需再工程里引用,只要把dll文件放在bin\debug文件夹下就好了,还有一个mix.dll也要放进去


'设置视频时间、日期叠加参数     
    Declare Function VCASetVidCapDateTimeOSDParam Lib "Sa7134Capture.dll" (ByRef pOSDParam As OSDParam) As Boolean
    '设置视频时间、日期叠加        
    Declare Function VCASetVidCapDateTimeOSD Lib "Sa7134Capture.dll" (ByRef dwCard As Integer, ByRef bEnableOSD As Integer, ByRef ptTopLeft As Point) As Boolean
    这样就可以了

热点排行