海康威视4008HC版卡,做视频监控用的,可是得不到该卡的序列号,附函数原型及说明,急,在线等...谢谢(200分)

  • 主题发起人 主题发起人 selonboy
  • 开始时间 开始时间
S

selonboy

Unregistered / Unconfirmed
GUEST, unregistred user!
海康威视4008HC版卡,做视频监控用的,可是得不到该卡的序列号。下面提供详细资料:
函数原型:
DLLEXPORT_API int __stdcall GetBoardDetail(UINT

boardNum,DS_BOARD_DETAIL *pBoardDetail);
说明:
int GetBoardDetail (UINT boardNum,DS_BOARD_DETAIL

*pBoardDetail)
参数: UINT boardNum 板卡索引(装有一块卡为0,

两块卡为1..大概是这样子)
DS_BOARD_DETAIL *pBoardDetail 返回版卡信息

typedef struct
{
BOARD_TYPE_DS type;
//版卡类型
BYTE sn[16];
//此处为序列号
UINT dspCount;
//版卡包含的DSP个数
}
返回:正确为0,其它为错误。

该函数翻译成Delphi函数是:
function GetBoardDetail(boardNum: UInt;
pBoardDetail:

PDS_BOARD_DETAIL): integer;
stdcall;

var Board:PDS_BOARD_DETAIL;
temsn:array[0..15] of byte;
begin

GetBoardDetail(1,Board);
Board.sn ------>注意:就是这个地方可以得到版卡的序列

号,可是我如何把它转成可显示的字符串呢?
...
end;


请各路高人帮助,我忙活了三天了都没搞定,我在线等,谢

谢了...
 
实际上也就是一个temsn:array[0..15] of byte;
转换成字符串类型的操作,可是我一直没搞明白。
这个问题怎么解决啊,在这儿送上200分,请高人帮助解答。
 
用pByte
或者一个一个copy出来啊,move()或者copy()
 
var
i:byte;
Board:PDS_BOARD_DETAIL;
str:string;
begin

GetBoardDetail(1,Board);//获取函数
for i:=0 to 15do

str:=str+inttostr(Board.sn);
showmessage('序列号:'+str);//可是得出的字符串和SDK示例(C写)所得到的号完全不一样,肯定人家是对的。怎么办?
end;


------------
 
那就看看人家byte里取得的什么内容,16进制,ASII等等
 
这个函数改一下,试试
function GetBoardDetail(boardNum: UInt;
var pBoardDetail:
PDS_BOARD_DETAIL): integer;
stdcall;
 
To Uiit:
谢谢,在这儿我再附上一段SDK源码,C写:(中文注释是我添加的,不知理解的有无错误,我对C不懂)
// TODO: Add extra initialization here
UINT boardCount;
DS_BOARD_DETAIL boardDetail;
DSP_DETAIL dspDetail;
CDialog::OnInitDialog();
char str[100];
char sn[12+1];

boardCount=GetBoardCount();//这儿是得到主板上装的板卡总数
for(UINT board=0;board<boardCount;board++)//循环检测已安装的每块版卡
{
GetBoardDetail(board,&boardDetail);//这是关键函数,得到板卡详细信息
for(UINT i=0;i<12;i++) //再来一个循环
sn=boardDetail.sn+0x30;//得到序列号,天啊,能在Delphi里解决吗...
sn[12]=0;
//最后是格式化输出,最后SN显示:
sprintf(str,&quot;Board:%2u Type:%s,SN:%s&quot;,
board,boardType[boardDetail.type],sn);

.....
 
1、首先它显示就是16进制,你用IntToHex(sn,2)
如果还不对,你就把你修改后的函数改成我上面所说
如果还不行可以的话加QQ:4835386 说说看(应该可以的[:)])
 
TO uiit:
这个函数改一下,试试
function GetBoardDetail(boardNum: UInt;
var pBoardDetail:
PDS_BOARD_DETAIL): integer;
stdcall;

我原来帖过来的是:
function GetBoardDetail(boardNum: UInt;
pBoardDetail:
PDS_BOARD_DETAIL): integer;
stdcall;

对比二者只差添加了一个var,这有何区别吗?
 
请大家踊跃跟帖啊,问题一经解决,自会放分给应该得到分数的朋友,分不够可以再加,来这儿大家就是朋友。
:)
 
Uiit:
&quot;1、首先它显示就是16进制,你用IntToHex(sn,2)&quot;
在SDK示例程序中显示的不是16进制,而是:121200016444
这样的序列号...
 
1、var 是有区别的
2、我看错了那个序列号是本身又加了个十六进制30而生成的,你加上试试
3、现在有点事,如果中午没有搞定的话我在
 
好的我试试再说,多谢uiit!
 
要到晚上才可能过来放分,请各位耐心等候,有高策者继续跟帖,意见中肯者有分相送,在下不会食言。
我现在有些忙,烦请帮助顶帖。谢谢。
 
超级郁闷中....
又一天过去了,还是没能解决上面提到的问题,
谁还有办法?
 
你的代码有误 应该为 :

var
i:byte;
Board:PDS_BOARD_DETAIL;
str:string;
begin

GetBoardDetail(1, Board);//获取函数

for i:=0 to 15do

str:= str + IntToStr(Board.sn)

showmessage('序列号:'+str);
end;
 
To zhongs:
是笔误,我发那段话时恰手头没有那段代码,随手打上来的。
但是无论是笔误还是上面你更正过的代码,都得不到正确的结果。
SDK示例程序中显示序列号为:121200058444
而依照我们的代码却显示出几十位以上的数字。
比如我单独摘出str[6]
发现它的内容居然像232这样的三位数字!
谁能解释这是怎么回事?
 
用原厂家附带的SDK说明文档及C示例测试两块相同型号的采集卡,读取到的序列号的确是不一样的,但是关键想用Delphi写出来,所以到现在也只能是大眼瞪小眼......
 
Function BordSnToStr(SnData:PChar):String;
var
I:Integer;
begin

SetLength(Result, 12);
for I := 1 to 12do

begin

Result := char(ord(SnData^)+$30);
Inc(SnData);
end;

end;



str : String;
......
GetBoardDetail(1, Board);
Str := BordSnToStr(PChar(@Board.Sn));
 
我想应该是GetBoardDetail(1, Board);
执行不成功 这是取第二块卡
你应该先试取第一块卡GetBoardDetail(0, Board);

另外要检查GetBoardDetail返回值:正确为0,其它为错误。
 
后退
顶部