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

dll文件函数手册(供C++使用的):
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;
/设置视频捕获时间、日期叠加,在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

调用函数:

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

这说明你调用 API 传参存在问题。

首先有没有设置结构体内存对齐?
[StructLayout(LayoutKind.Sequential)] 加了吗?

COLORREF 不要用 Color 代替,用 int 代替
TCHAR cfFaceName[32] 定义为 Byte 数组也可以,带在传参前,必须初始化为 32 个长度追问

color用int代替的话,是不是要把System.Drawing.Color.FromArgb(255, 255, 255)改成RGB(255, 255, 255)啊?我改了以下部分:


原来的代码中,在传参数前有:ReDim OsdParameter.cfFaceName(31)  ‘  //改成32我也试过

改好后,还是会出现同样的错误啊?是不是别的参数类型也有问题啊?

追答

你自己多试试啊,导致这种问题,数据类型问题或值类型引用类型问题。

温馨提示:答案为网友推荐,仅供参考