以下代码错误原因?(50分)

  • 主题发起人 主题发起人 zhbj
  • 开始时间 开始时间
Z

zhbj

Unregistered / Unconfirmed
GUEST, unregistred user!
var
Dlen:Cardinal ;
tream :Tmemorystream ;
lpVhdr: PVIDEOHDR

begin

tream:=Tmemorystream.Create() ;
Tream.Clear ;
Dlen:=lpVhdr^.dwBufferLength ;
tream.SetSize(Dlen) ;
Tream.Position:=0 ;
Copymemory(pointer(Longint(Tream.memory)) ,lpVhdr^.lpData,Dlen );
NmUDP1.SendStream(tream) ; //此处运行显示内存不能“Write”,退出
tream.Free ;
 
var
Dlen:Cardinal ;
tream :Tmemorystream ;
lpVhdr: PVIDEOHDR
begin
tream:=Tmemorystream.Create() ;
Dlen:=lpVhdr^.dwBufferLength ;
tream.SetSize(Dlen) ;
Copymemory(pointer(Longint(Tream.memory)) ,lpVhdr^.lpData,Dlen );
NmUDP1.SendStream(tream) ; //此处运行显示内存不能“Write”,退出
tream.Free ;

这样试试,我这边可以的。
 
lpVhdr 的值从那里来的?
 
你把:
Copymemory(pointer(Longint(Tream.memory)) ,lpVhdr^.lpData,Dlen );
改成:
Copymemory(pointer(Longint(Tream.memory)) ,pchar('test'),4);
试试看,如果成功,就是你的lpvhdr^.lpdata不对。
 
其实是采用的 VideoCap控件的 VideoStream 事件
form.VideoCap1Videostrem(sender:Tbject; lpVhdr: PVIDEOHDR ) ;
var
Dlen:Cardinal ;
tream :Tmemorystream ;
begin
tream:=Tmemorystream.Create() ;
Tream.Clear ;
Dlen:=lpVhdr^.dwBufferLength ;
tream.SetSize(Dlen) ;
Tream.Position:=0 ;
Copymemory(pointer(Longint(Tream.memory)) ,lpVhdr^.lpData,Dlen );
NmUDP1.SendStream(tream) ; //此处运行显示内存不能“Write”,退出
tream.Free ;
End ;

感谢yeath兄,但按照你的说法,修改后还是不行 ,请你仔细实验一下,万分感激
 
感谢:
改成:
Copymemory(pointer(Longint(Tream.memory)) ,pchar('test'),4);
错误依旧……
 
var
tream:TMemoryStream;
begin
tream := TMemoryStream.Create;
tream.SetSize(4);
Copymemory(pointer(Longint(Tream.memory)) ,pchar('test'),4);
NMUDP1.SendStream(tream);
tream.Free;
end;
我这里这样没问题的,你试试。
 
加个断点看看Memory是不是nil.
如是就不要Tream.Clear ;
 
yeath :
原来Dlen:=lpVhdr^.dwBufferLength 的值为57600 ;
用Copymemory(pointer(Longint(Tream.memory)) ,pchar('test'),4);实验

设tream.setzise(2054) 正常; //2055以后便出现错误,不知何故
 
lpVhdr: PVIDEOHDR 未分配空间!!
 
Dlen:=lpVhdr^.dwBufferLength ;
前加:new(lpVhdr);

但你怎么不初始化 lpVhdr^ 就取值。


最后
dispose(lpVhdr);
 
这个可能跟nmudp有关系的,我以前做的语音聊天程序也是这有这种问题,
包大小大于这个数值的,就送不过来。
我现在用Socket api来写发送接收。
 
yeach:
请问如何使用Socket api来写发送和接收。
希望在允许的范围多告诉一下,万分感激 !!
 
多人接受答案了。
 
function Tfrm_Send.CreateSocket: TSocket;
var
wData:TWSAData;
wAddr:sockaddr_in;
TempSocket:TSocket;
iRet:Integer;
begin
iRet := WSAStartup($0101,wData);
if iRet<>0 then
begin
showmessage('wsastartup');
exit;
end;
TempSocket := socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if TempSocket=INVALID_SOCKET then
begin
showmessage('socket');
exit;
end;

wAddr.sin_family := AF_INET;
wAddr.sin_port := htons(udpPort);
wAddr.sin_addr.S_addr := htonl(INADDR_ANY);
iRet := bind(TempSocket,wAddr,sizeof(wAddr));
if iRet=SOCKET_ERROR then
begin
ShowMessage('bind');
exit;
end;

WSAAsyncSelect(TempSocket,self.Handle,WM_SOCK,FD_READ);
Result := TempSocket;
end;
//以上是创建Socket的代码,
 
后退
顶部