指针释放出错!!在线等,急需解决!500分!(另开一题再给200) ( 积分: 300 )

  • 主题发起人 主题发起人 悠悠蓝天
  • 开始时间 开始时间

悠悠蓝天

Unregistered / Unconfirmed
GUEST, unregistred user!
Type
LPNET_DVR_PICCFG = ^NET_DVR_PICCFG;
NET_DVR_PICCFG = record
dwSize:DWORD
// 此结构的大小
sChanName: ByteArr
// 通道名称
dwVideoFormat:DWORD
// 只读 视频制式 1-NTSC 2-PAL */
byBrightness:BYTE
//*亮度,0-255*/
byContrast:BYTE
//*对比度,0-255*/
bySaturation:BYTE
//*饱和度,0-255 */
byHue:BYTE
//*色调,0-255*/
//显示通道名
dwShowChanName:DWORD
//*预览的图象上是否显示通道名称,0-不显示,1-显示区域大小 704*576*/
wShowNameTopLeftX:WORD
//* 通道名称显示位置的 x 坐标 */
wShowNameTopLeftY:WORD
//* 通道名称显示位置的 y坐标 */
//信号丢失报警
struVILost:NET_DVR_VILOST;
//移动侦测
struMotion:NET_DVR_MOTION;
//遮挡报警
strHideAlarm:NET_DVR_HIDEALARM;
//遮挡 区域大小 704*576
dwEnableHide:DWORD
//* 是否启动遮挡 ,0-否,1-是*/
wHideAreaTopLeftX:WORD
//* 遮挡区域的 x 坐标 */
wHideAreaTopLeftY:WORD
//* 遮挡区域的 y坐标 */
wHideAreaWidth:WORD
//* 遮挡区域的宽 */
wHideAreaHeight:WORD
//*遮挡区域的高*/
//OSD
dwShowOsd:WORD
//* 预览的图象上是否显示 OSD,0-不显示,1-显示 */
wOSDTopLeftX:WORD
//* OSD的 x坐标 */
wOSDTopLeftY:WORD
//* OSD的 y坐标 */
byOSDType:BYTE
//* OSD类型(主要是年月日格式) */
//* 0: XXXX-XX-XX 年月日 */
//* 1: XX-XX-XXXX 日月年 */
//* 2: XXXX年 XX月 XX日 */
//* 3: XX月 XX日 XXXX 年 */
byDispWeek:BYTE
//* 是否显示星期 */
byOSDAttrib:BYTE
//* OSD属性:透明,闪烁 */
//* 1: 透明,闪烁 */
//* 2: 透明,不闪烁 */
//* 3: 闪烁,不透明 */
//* 4: 不透明,不闪烁 */
end;

{--------------------------------------------------------------------
功能:获取硬盘录像机的参数
参数说明
lUserID:NET_DVR_Login ()的返回值
dwCommand:参数类型
lChannel:通道号,如果不是通道参数,lChannel 不用,置为-1 即可
lpOutBuffer:存放输出参数的缓冲区
dwOutBufferSize:缓冲区的大小
lpBytesReturned:实际返回的缓冲区大小
返回值:TRUE 表示成功,FALSE 表示失败。
---------------------------------------------------------------------}
function NET_DVR_GetDVRConfig(lUserID:LONGint;dwCommand:DWord;lChannel:longint;lpOutBuffer:pointer;dwOutBufferSize:DWORD;lpBytesReturned:LPDWORD):boolean;stdcall
external 'HCNetSDK.dll';

上面是一个开发包(VC)中的定义,我把它改成delphi语言了。

现在的问题是
procedure Tform1.SetChanName(iChanID:longint;NewName:string);
var
piccfg:LPNET_DVR_PICCFG;
sWord:Dword;
i:integer;
ss:string;
begin
new(piccfg)
//分配空间
NET_DVR_GetDVRConfig(m_lUserID,NET_DVR_GET_PICCFG,1,piccfg,PICCFG_SIZE,@sWord);
..........
.......
[red] dispose(piccfg);[/red] [yellow]//出错!!!![/yellow]
end;

NET_DVR_GetDVRConfig执行了,而且返回了true,但是一调用这个函数就会指针报错。
如果调用NET_DVR_GetDVRConfig会指针报错,释放不了。project raised exception class EIValidPointer with message 'Invalid pointer operation'Process stopped.


困挠小女子好多天了,大哥们帮帮忙。!!!
 
我认为是piccfg的问题。不能修改类型定义和外部函数

为什么释放不了那????[xx(][xx(][xx(]
 
我顶,我顶,问题不难,只是我不懂,看到指针就头大!!!
 
你用的海康的还是谁的?
我看看这个问题,
 
procedure Tform1.SetChanName(iChanID:longint;NewName:string);
var
piccfg:NET_DVR_PICCFG;
sWord:Dword;
i:integer;
ss:string;
begin
NET_DVR_GetDVRConfig(m_lUserID,NET_DVR_GET_PICCFG,1,pointer(@piccfg),PICCFG_SIZE,@sWord)

这样试试,不用分配也不用释放,也许是函数里没处理好,你的代码看上去没问题
 
lpdword 在DELPHI里面有这个类型。定义这个指针,然后给指针分配内存,就可以了。其它的地方没错。 ,@sWord 象这么用肯定是不行的。
 
另外,任何指针都是 longint 类型, 传一个什么类型的指针倒也无所谓,反正最终是longint。不过为了保持一致性, 用pointer(piccfg) 转换一个也可以。注意不是pointer(@piccfg) 这样的。因为 piccfg 已经是指针了。
 
dangde:的确就是海康的。谢谢了!
 
如果还有什么问题加我的MSN dangde@163.com
 
ysai:你的方法不行,我也想到过,我试验过了。这次也能够成功取出数据,但是提示另外一个错误,存取错误
access violation at address 0000001.read of address 000001
 
dangde,能不能具体改一下代码???
 
你的意思是错误不在piccfg而在sword???,但是为什么他数据又取出来呢?sword是有数值的。谢谢了
 
你晚上在么?因为明天上午我就要用,所以想晚上把他调出来
 
把VC形式的函数定义贴出来看看,是不是你改写成Delphi函数时出问题了?
 
如果我定义错了,还能够执行成功并且把数值取出来么??我觉得应该不是这里的问题巴?
BOOL NET_DVR_GetDVRConfig(LONG lUserID, DWORD dwCommand,LONG lChannel,
LPVOID lpOutBuffer,DWORD dwOutBufferSize,LPDWORD lpBytesReturned)
功能:获取硬盘录像机的参数
参数说明
lUserID:NET_DVR_Login ()的返回值
dwCommand:参数类型
lChannel:通道号,如果不是通道参数,lChannel 不用,置为-1 即可
lpOutBuffer:存放输出参数的缓冲区
dwOutBufferSize:缓冲区的大小
lpBytesReturned:实际返回的缓冲区大小
返回值:TRUE 表示成功,FALSE 表示失败。

BOOL NET_DVR_SetDVRConfig(LONG lUserID, DWORD dwCommand,LONG lChannel,
LPVOID lpInBuffer,DWORD dwInBufferSize)
设置硬盘录像机的参数
参数说明
lUserID:NET_DVR_Login ()的返回值
dwCommand:参数类型
lChannel:通道号,如果不是通道参数,lChannel 不用,置为0即可
lpInBuffer:存放输入参数的缓冲区
dwInBufferSize:缓冲区的大小
- 55 -

技术文档
返回值:TRUE 表示成功,FALSE 表示失败。

dwCommand 的类型定义如下:
#define NET_DVR_GET_DEVICECFG 100 //获取设备参数
#define NET_DVR_SET_DEVICECFG 101 //设置设备参数
#define NET_DVR_GET_NETCFG 102 //获取网络参数
#define NET_DVR_SET_NETCFG 103 //设置网络参数
#define NET_DVR_GET_PICCFG 104 //获取图象参数
#define NET_DVR_SET_PICCFG 105 //设置图象参数
#define NET_DVR_GET_COMPRESSCFG 106 //获取压缩参数
#define NET_DVR_SET_COMPRESSCFG 107 //设置压缩参数
#define NET_DVR_GET_RECORDCFG 108 //获取录像时间参数
#define NET_DVR_SET_RECORDCFG 109 //设置录像时间参数
#define NET_DVR_GET_DECODERCFG 110 //获取解码器参数
#define NET_DVR_SET_DECODERCFG 111 //设置解码器参数
#define NET_DVR_GET_RS232CFG 112 //获取 232 串口参数
#define NET_DVR_SET_RS232CFG 113 //设置 232 串口参数
#define NET_DVR_GET_ALARMINCFG 114 //获取报警输入参数
#define NET_DVR_SET_ALARMINCFG 115 //设置报警输入参数
#define NET_DVR_GET_ALARMOUTCFG 116 //获取报警输出参数
#define NET_DVR_SET_ALARMOUTCFG 117 //设置报警输出参数
#define NET_DVR_GET_TIMECFG 118 //获取 DVR时间
#define NET_DVR_SET_TIMECFG 119 //设置 DVR时间
#define NET_DVR_GET_PREVIEWCFG 120 //获取预览参数
#define NET_DVR_SET_PREVIEWCFG 121 //设置预览参数
#define NET_DVR_GET_VIDEOOUTCFG 122 //获取视频输出参数
#define NET_DVR_SET_VIDEOOUTCFG 123 //设置视频输出参数
#define NET_DVR_GET_USERCFG 124 //获取用户参数
#define NET_DVR_SET_USERCFG 125 //设置用户参数
#define NET_DVR_GET_EXCEPTIONCFG 126 //获取异常参数
#define NET_DVR_SET_EXCEPTIONCFG 127 //设置异常参数
#define NET_DVR_GET_SHOWSTRING 130 //获取叠加字符参数
#define NET_DVR_SET_SHOWSTRING 131 //设置叠加字符参数
#define NET_DVR_GET_AUXOUTCFG 140 //获取报警触发辅助输出设置
#define NET_DVR_SET_AUXOUTCFG 141 //设置报警触发辅助输出设置
#define NET_DVR_GET_PICCFG_EX 200 //获取图象参数(扩展)
#define NET_DVR_SET_PICCFG_EX 201 //设置图象参数(扩展)
#define NET_DVR_GET_USERCFG_EX 202 //获取用户参数
#define NET_DVR_SET_USERCFG_EX 203 //设置用户参数

注:以获取设备的参数和设置设备的参数为例,代码如下:
//获取设备的参数
NET_DVR_DEVICECFG devicecfg

DWORD BytesReturned

NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_DEVICECFG, 0, &devicecfg,
sizeof(NET_DVR_DEVICECFG), &BytesReturned)

//设置设备的参数
NET_DVR_DEVICECFG devicecfg

- 56 -

技术文档
NET_DVR_SetDVRConfig(lUserID, NET_DVR_SET_DEVICECFG, 0, &devicecfg,
sizeof(NET_DVR_DEVICECFG));
 
??怎么办,改了sword也不行
 
努力学习,天天向上!
 
day day study,day day up
 
规范一点是这样的:
new(piccfg)

if(piccfg=nill) then exit ;

//确保成功
NET_DVR_GetDVRConfig(m_lUserID,NET_DVR_GET_PICCFG,1,piccfg,PICCFG_SIZE,@sWord);

/*在这里把piccfg输出看看。或者调试看看是否是预期的值。*/

dispose(piccfg);
 
经过dangde一个晚上的检查,总算目前没有看到这个错了,明天去现场,等待现实的检验,希望一切顺利!
 

Similar threads

D
回复
0
查看
795
DelphiTeacher的专栏
D
I
回复
0
查看
796
import
I
I
回复
0
查看
948
import
I
I
回复
0
查看
811
import
I
后退
顶部