紧急提问:传参数到DLL的问题,急,没分了也得给100分,解决就结帐哈。

tmran 2005-05-13 05:49:14
实现效果:
设置远程视频服务器的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
...全文
230 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
tmran 2005-05-23
  • 打赏
  • 举报
回复
谢谢热心的CSDN人,问题已经搞定,原因是:

1、 该CSDN上确实存在好多错误信息,让我们新学者吃尽苦头,例如:VC、VB代码转换的若干例子中,都有人回帖说“VC中的Word类型等于VB中的Long类型”,实际上是Integer,Dword才是Long类型。

2、 VC的结构中,如果有字符串指针,需要将变量设置为Byte数组,然后把该数组传递到VB结构的字符串中,否则,结构的长度将不符合VC的DLL的需要。

再次感谢大家,有空到www.willgo.net (纬尔管理资讯网)逛逛,我不是程序员,我是做管理的,呵呵。
zlt982001 2005-05-21
  • 打赏
  • 举报
回复
Dim lpString as String*32
lpString 赋值后请在末尾添加 Chr(0)
因为 C 的字符串都是以 Chr(0) 结束的,VB的字符串没有,所以有误
hr88rong 2005-05-21
  • 打赏
  • 举报
回复
这么多星级的在这,咱也不敢多发言,不过确实是自己不懂,哈哈,不过这个问题是VB的吗?还基础呢,吓我1!
LordSimon 2005-05-21
  • 打赏
  • 举报
回复
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
在下是新手,可能不对,呵呵,望楼主海函...
wumylove1234 2005-05-21
  • 打赏
  • 举报
回复
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
supergreenbean 2005-05-21
  • 打赏
  • 举报
回复
呵呵,再给点信息,这样好帮你
tmran 2005-05-20
  • 打赏
  • 举报
回复
tmran 2005-05-20
  • 打赏
  • 举报
回复
supergreenbean 2005-05-17
  • 打赏
  • 举报
回复
呵呵,我是说真地,因为这种跨语言编程失败的原因大多都是因为使用错误造成的
tmran 2005-05-16
  • 打赏
  • 举报
回复
还是不行哦,怎么办???老师们。
tmran 2005-05-16
  • 打赏
  • 举报
回复
这个我试过了,还是不行。
supergreenbean 2005-05-16
  • 打赏
  • 举报
回复
不好意思是我的错,忘了改这个了

Type TITALOSD
lpString(0 To 31) As Byte
x As Integer
y As Integer
End Type
qjzrd 2005-05-16
  • 打赏
  • 举报
回复
xuexi
tmran 2005-05-16
  • 打赏
  • 举报
回复
晕ing
  • 打赏
  • 举报
回复
学习
rr12 2005-05-16
  • 打赏
  • 举报
回复
'声明部分:

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
supergreenbean 2005-05-16
  • 打赏
  • 举报
回复
那很可能是你的使用问题了……
qrlvls 2005-05-15
  • 打赏
  • 举报
回复
好复杂
supergreenbean 2005-05-15
  • 打赏
  • 举报
回复
看了声明部分,感觉要改这么几个地方

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

调用部分没多看.....
tmran 2005-05-15
  • 打赏
  • 举报
回复
下午试试看,谢谢各位。
加载更多回复(10)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧