引入非托管类dll出现的错误“尝试读取或写入受保护的内存”
vb.net吧
全部回复
仅看楼主
level 1
做的是软件二次开发,提供的DLL文件本来是供C++二次开发用的,但我使用的编程软件是vb.net
dll文件函数手册(供C++使用的):
BOOL WINAPI VCASetVidCapDateTimeOSD( DWORD dwCard, BOOL bEnableOSD, POINT& ptTopLeft);
vb.net使用该DLL文件:
先将以上代码转为vb.net代码
Declare Function VCASetVidCapDateTimeOSD Lib "Sa7134Capture.dll" _
(ByVal dwCard As Int32, ByVal bEnableOSD As Int32, ByRef ptTopLeft As POINT) As Boolean
Structure POINT
Public X As Integer
Public Y As Integer
End Structure
调用函数(vb.net):
Public OsdTimepoint As POINT
OsdTimepoint.X = 10
OsdTimepoint.Y = 20
VCASetVidCapDateTimeOSD(0, 1, OsdTimepoint)
当执行到VCASetVidCapDateTimeOSD(0, 1, OsdTimepoint)就会出现错误“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”。是不是ByRef和ByVal的问题,我将所有的ByVal换成ByRef的话,则VCASetVidCapDateTimeOSD的返回值为False,说明执行失败。
同样的代码,用VB执行下来就没有问题(VB中得把Int32改为Long)。
求指教一下!
2013年10月18日 04点10分 1
level 13
boolean应当按unmanagedtype.bool传递。如果图省事可声明成int16
2013年10月18日 13点10分 2
level 13
去看marshalas的教程
2013年10月18日 13点10分 3
自己解决了,前面漏了一个OPENDEVICE[哈哈]
2013年10月25日 06点10分
加在哪里 啊???
2014年09月11日 07点09分
1