实现效果:
设置远程视频服务器的OSD叠加(内容,显示位置等)。SDK的函数说明:BOOL VSNET_ClientSetChanOSD(char *m_sername,char *m_url,char m_ch,char *m_username,char *m_password,CHANNOSD *m_pSetPara,WORD wserport = 3000)
说明:设置OSD参数;
参数说明:
m_sername:服务器名称;
m_url:服务器地址;
m_ch:通道号;
m_username:用户名;
m_password:密码;
m_pSetPara:指向CHANNOSD的指针;
wserport :服务器端口号;
返回值:成功返回TRUE,失败返回FALSE;CHANNOSD结构:
typedef struct
{
TIMEOSD m_time;
TITALOSD m_tital[4];
BITSINFOOSD m_bits;
}CHANNOSD;
说明:
m_time:时间显示;
m_tital:4个字符显示;
m_bits:码率信息显示;TIMEOSD结构:
typedef struct
{
int nFormat; //ETI_TIME_FORMAT_1,ETI_TIME_FORMAT_2,ETI_TIME_FORMAT_3
unsigned short x,y; //显示的位置,x为4的倍数
}TIMEOSD;
说明:
nFormat:
0:关闭,不显示;
1: 显示,格式为:2003-09-12 15:23:33
2:显示,格式为:2003-09-12 星期五 15:23:33
3:显示,格式为:09-12-2003 15:23:33
4:显示,格式为:09-12-2003 星期五 15:23:33
x,y:显示的位置,该位置的范围为0-704,0-576,与图像的分辨率无关,x必须为;BITSINFOOSD结构:
typedef struct
{
int bShow;
unsigned short x,y;
}BITSINFOOSD;
说明:
bShow:显示开关,1:显示,0:关闭;
x,y:显示的位置,该位置的范围为0-704,0-576,与图像的分辨率无关;TITALOSD结构:
typedef struct
{
char lpString[32];
unsigned short x,y;
}TITALOSD;
说明:
lpString:显示的字符,为空不显示;
x,y:显示的位置,该位置的范围为0-704,0-576,与图像的分辨率无关;我的代码:函数声明:模块'设置OSD参数
Public Declare Function VSNET_ClientSetChanOSD Lib "NetClient.dll" _
                                            (ByVal m_sername As String, _
                                            ByVal m_url As String, _
                                            ByVal m_ch As Byte, _
                                            ByVal m_username As String, _
                                            ByVal m_password As String, _
                                            ByRef m_pSetPara As CHANNOSD, _
                                            ByVal wserport As Long) As Boolean
'通用全局变量
Public ServerName As String              '服务器名称
Public nCHanel As Integer                '通道
Public URL As String                     'IP
Public Username As String                '用户名
Public Password As String                '密码
Public wserport As Long                  '端口
'BITSINFOOSD 结构:  
Type BITSINFOOSD     
    bShow As Long   
    x As Integer    
    y As Integer
End Type
'说明:
'bShow:显示开关,1:显示,0:关闭;
'x,y:显示的位置,该位置的范围为0-704,0-576,与图像的分辨率无关;'TITALOSD 结构:
Type TITALOSD
    lpString As String                   '问题出现在这里,由于这个始终有问题,会影响其他参数。
    x As Integer
    y As Integer
End Type
'说明:
'lpString:显示的字符,为空不显示;
'x,y:显示的位置,该位置的范围为0-704,0-576,与图像的分辨率无关;'TIMEOSD 结构
Type TIMEOSD
    nFormat As Long  '; //ETI_TIME_FORMAT_1,ETI_TIME_FORMAT_2,ETI_TIME_FORMAT_3
    x As Integer       '; //显示的位置,x为4的倍数
    y As Integer
End Type'说明:
'nFormat:
'0:关闭,不显示;
'1: 显示,格式为:2003-09-12 15:23:33
'2:显示,格式为:2003-09-12 星期五 15:23:33
'3:显示,格式为:09-12-2003 15:23:33
'4:显示,格式为:09-12-2003 星期五 15:23:33
'x,y:显示的位置,该位置的范围为0-704,0-576,与图像的分辨率无关,x必须为;
'OSD--CHANNOSD结构:
Type CHANNOSD
    m_time As TIMEOSD
    m_tital As TITALOSD
    m_bits As BITSINFOOSD
End Type'程序调用:
Private Sub CmdWriteOSD_Click()
    Dim ret As Boolean
    Dim pCHOSD As CHANNOSD
    Dim pBIT As BITSINFOOSD
    Dim pTitle As TITALOSD
    Dim pTime As TIMEOSD
    Dim chn As Byte
    Dim txtP As String
    'Dim i As Long
    'Dim tmp As String
    Dim txtTEMP As String
    
    txtP = "\0"
    
    With pTime
        .nFormat = CombTime.ListIndex
        .x = xTime.Text
        .y = yTime.Text
    End With
    
    txtTEMP = Trim(txtTitle.Text)
    'txtTEMP = StrConv(txtTEMP, vbUnicode) & txtP   '这个txt是想为字符串添加一个结束符,呵呵,真不知道怎么做。
    With pTitle
        
        .lpString = txtTEMP
        .x = xTitle.Text
        .y = yTitle.Text
           
    End With
    
    With pBIT
        .bShow = CHECKBit.Value
        .x = xBIT.Text
        .y = yBIT.Text
    End With
    
    nCHanel = Trim(txtCHanel.Text)
    chn = nCHanel
    
    With pCHOSD
        .m_time = pTime
        .m_tital = pTitle
        .m_bits = pBIT
    End With
       
    ret = VSNET_ClientSetChanOSD(ServerName, URL, chn, Username, Password, pCHOSD, wserport)
    If ret Then
        'MsgBox "²Ù×÷³É¹¦"
        bSDKOpen = True
        Timer1.Interval = 100
        Timer1.Enabled = True
    Else
        MsgBox "²Ù×÷ʧ°Ü"
        bSDKOpen = False
    End If
    
End Sub

解决方案 »

  1.   

    你的代码贴得太多,我不知道你的问题在什么地方typedef struct
    {
    char lpString[32];
    unsigned short x,y;
    }TITALOSD;在VB中这样转换我觉得比较好:
    Type TITALOSD
        lpString (1 To 32) As Byte
        x As Integer
        y As Integer
    End Type
      

  2.   

    然后在需要像lpString里面写字符串的时候用copymemory的方法将字符串拷贝到这个byte数组里面
      

  3.   

    把关键部份帖出来啊大致看了一下:
        With pTime
            .nFormat = CombTime.ListIndex
            .x = xTime.Text
            .y = yTime.Text
        End With好像里面的类型不配置
      

  4.   

    看了声明部分,感觉要改这么几个地方Public Declare Function VSNET_ClientSetChanOSD Lib "NetClient.dll" _
                                                (ByVal m_sername As String, _
                                                ByVal m_url As String, _
                                                ByVal m_ch As Byte, _
                                                ByVal m_username As String, _
                                                ByVal m_password As String, _
                                                ByRef m_pSetPara As CHANNOSD, _
                                                ByVal wserport As Integer) As Long...'TITALOSD 结构:
    Type TITALOSD
        lpString(0 to 31) As String                      
        x As Integer
        y As Integer
    End Type...'OSD--CHANNOSD结构:
    Type CHANNOSD
        m_time As TIMEOSD
        m_tital(0 to 3) As TITALOSD
        m_bits As BITSINFOOSD
    End Type调用部分没多看.....
      

  5.   

    还是没搞定哦,问题是这样的:现在要使用一个结构将参数传到DLL中,DLL的文档这样说的:TITALOSD结构:
    typedef struct
    {
    char lpString[32];
    unsigned short x,y;
    }TITALOSD;
    说明:
    lpString:显示的字符,为空不显示;
    x,y:显示的位置,该位置的范围为0-704,0-576,与图像的分辨率无关;现在需要我用VB写这样的结构,然后传参数,实际上主要是两种不同语言的结构描述方法问题,我是这样做的:声明部分:
    Type TITALOSD
        lpString(0 To 31) As String
        x As Integer
        y As Integer
    End Type调用部分:
    Dim i, j As Long
    Dim txtAR(0 To 31) As String
    For i = 0 To Len(Trim(txtTitle.Text)) - 1
                
        txtAR(i) = Mid(Trim(txtTitle.Text), i + 1, 1)
            
    Next i
    With pTitle
        For j = 0 To i
            .lpString(i) = txtAR(j) ' StrConv(txtAR(j), vbFromUnicode)
        Next j
        .x = xTitle.Text
        .y = yTitle.Text
               
    End With
      

  6.   

    '声明部分:Private Type TITALOSD
        lpString As String
        x As Integer
        y As Integer
    End Type'调用部分:Private Sub Command1_Click()   Dim i, j As Long
       Dim pTitle As TITALOSD   Dim txtAR(0 To 31) As String
       For i = 0 To Len(Trim(txtTitle.Text)) - 1
                
           txtAR(i) = Mid(Trim(txtTitle.Text), i + 1, 1)
            
       Next i
       With pTitle
           For j = 0 To i
               .lpString = .lpString & txtAR(j) ' StrConv(txtAR(j), vbFromUnicode)
           Next j
           '.x = xTitle.Text
           '.y = yTitle.Text
               
       End With   MsgBox ("Result is : " & pTitle.lpString)
    End Sub
      

  7.   

    不好意思是我的错,忘了改这个了Type TITALOSD
        lpString(0 To 31) As Byte
        x As Integer
        y As Integer
    End Type
      

  8.   

    Private Sub Command1_Click()   Dim i, j As Long
       Dim pTitle As TITALOSD
       With pTitle
           .lpString = StrConv(Trim(txtTitle.Text),vbFromUnicode)
           '.x = xTitle.Text
           '.y = yTitle.Text
               
       End With   MsgBox ("Result is : " & pTitle.lpString)
    End Sub
      

  9.   

    typedef struct
    {
    char lpString[32];
    unsigned short x,y;
    }TITALOSD;
    中的第三行,char lpSting[32]是一个字符数组。相当于VB中的定长字符串。Type TITALOSD
        lpString(0 To 31) As Byte'楼主的声明则是声明了一个32个元素的字符数组...
        x As Integer
        y As Integer
    End Type我认为应该改为lpString as string*32
    在下是新手,可能不对,呵呵,望楼主海函...
      

  10.   

    Dim lpString as String*32
    lpString 赋值后请在末尾添加  Chr(0)
    因为 C 的字符串都是以 Chr(0) 结束的,VB的字符串没有,所以有误
      

  11.   

    谢谢热心的CSDN人,问题已经搞定,原因是:1、 该CSDN上确实存在好多错误信息,让我们新学者吃尽苦头,例如:VC、VB代码转换的若干例子中,都有人回帖说“VC中的Word类型等于VB中的Long类型”,实际上是Integer,Dword才是Long类型。2、 VC的结构中,如果有字符串指针,需要将变量设置为Byte数组,然后把该数组传递到VB结构的字符串中,否则,结构的长度将不符合VC的DLL的需要。再次感谢大家,有空到www.willgo.net (纬尔管理资讯网)逛逛,我不是程序员,我是做管理的,呵呵。