VBS jS问题较弱,但放在C#,Asp.net等论坛没人回答!4贴并一帖400分

yangyugw 2009-07-16 02:20:36
我有一个Activex组件,该组件将部署于客户端,用于与客户端安装的设备进行通讯。

我目前做法是用VBS调用该Activex组件,基本上可以实现功能,但我有些疑问想在这里和各位咨询下
Activex组件有三个函数,三个函数都具有多个in参数和多个out参数

1、没有采用js调用Activex的原因?
js是不是只能针对一个out参数,请高人指点一二!

2、前后后台代码互相调用的问题。
操作流如下,C#后台代码处理数据,调用Activex函数将数据写入设备中,Activex通过out参数告知成功失败。
成功后,C#后台将该条处理数据记录存入数据库。
目前难点在于 VBS无法准确的将out参数返回给后台。
我本来通过组件隐藏域将结果返回,VBS将结果赋值给组件隐藏域,然后后台代码通过该组件获得结果。但发现,必须在后台提交后才可以获得该隐藏域的值,在一个过程中,该组件的值并没有发生变化。

前台代码

<script language="VBscript">
Function sdWriteCardp(UserID,BuyPower,sData,PtcType,FlagInfo)
dim ReCode
MsgBox Cstr(UserID)
MsgBox BuyPower
MsgBox sData
MsgBox PtcType
MsgBox FlagInfo

SDUSB.WriteCard FlagInfo, BuyPower, UserID, PtcType ,sData , ReCode
document.getElementById("iReCode").value=ReCode;

End Function
</script>

隐藏域定义
<input type="hidden" id="iReCode" name="iReCode" value=""> 



后台代码

private void Button6_Click(object sender, System.EventArgs e) 
{
int FlagInfo =0;
double BuyPower=29.68;
string UserID = "0000000101";
string sData ="123456";
int PtcType =1;
string ss=" <script language='VBscript'> Call sdWriteCardp(\""+UserID+"\","+BuyPower.ToString()+
",\""+sData+"\","+PtcType.ToString()+","+FlagInfo.ToString()+") <" + "/script>";
//调用前台代码

Page.RegisterStartupScript("ccsdWriteCard",ss);

if(this.iReCode.value="0")//此处无法正确拿到本次调用VBS iReCode

{
//成功
}

}



麻烦各位就2个问题帮忙解答一下。


http://topic.csdn.net/u/20090715/17/b18d2690-7c9b-4d6b-b629-e63b7d33261d.html?51224
http://topic.csdn.net/u/20090716/10/67f5b34d-b7c5-45e8-92db-ce9bcad671b5.html
http://topic.csdn.net/u/20090716/14/b8d3926f-eb99-4350-9097-ef6a2974c401.html?64665
...全文
99 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
toury 2009-07-17
  • 打赏
  • 举报
回复
不幼稚。我刚接触WEB的时候,闹的笑话多了去了,呵呵。尤其是.net的WEB开发,多了SERVER控件后更容易混淆B/S两端的数据性质。
这不过就是一个学习过程而已
yangyugw 2009-07-17
  • 打赏
  • 举报
回复
看来还是要用到ajax才行,我之前也看了些资料关于C#前后台交互,用ajax比较好用。
第一次玩WEB所以问题有点幼稚,请谅解

结贴散分,请楼上2兄弟去其他3个页面留言,拿分
toury 2009-07-16
  • 打赏
  • 举报
回复
private void Button6_Click(object sender, System.EventArgs e)
{
int FlagInfo =0;
double BuyPower=29.68;
string UserID = "0000000101";
string sData ="123456";
int PtcType =1;
string ss=" <script language='VBscript'> Call sdWriteCardp(\""+UserID+"\","+BuyPower.ToString()+
",\""+sData+"\","+PtcType.ToString()+","+FlagInfo.ToString()+") <" + "/script>";
//调用前台代码

Page.RegisterStartupScript("ccsdWriteCard",ss);

if(this.iReCode.value="0")//此处无法正确拿到本次调用VBS iReCode

{
//成功
}

}
红字部分当然是行不通的,因为客户端和SERVER端异步执行代码,你刚发送了要客户端取数据的请求,它还在执行的时候你的SERVER代码就紧接着要取数据,别说你没刷新得不到,即使你的客户端送回数据你在这个button6_click()里也得不到的,呵呵

建议:
1、在客户端,当得到你要的数据后,立即AJAX到你现在的页面的后台或另外新写一个后台页面
2、你在本页面的SERVER端做一个接收数据函数,例如:fnRecvData(),用它来接收客户端的数据;或直接写一个新页面直接处理数据
toury 2009-07-16
  • 打赏
  • 举报
回复
1、这要看怎么理解了:在一个函数里如果只针对一个变量返回那自然是只返回一个OUT参数,但也有其他的办法啊,比如
1)你可以把要返回的OUT参数放到一个数组里返回
2)定义多个对应于你的多个OUT参数的全局变量,在函数里赋值后取得(当然,函数内部不能再次定义同名变量)
无论JS、VBS都可以这样处理

2、同1楼,如果可能,为什么不在客户端取得OUT参数后立即AJAX送往后台处理呢?
vc_help 2009-07-16
  • 打赏
  • 举报
回复
帮顶!
aCatInNight 2009-07-16
  • 打赏
  • 举报
回复
为什么不把所有脚本写在aspx页,脚本获取到out值后用xmlhttp提交到另外一个aspx页面来处理提交操作,这样能避免刷新又能提交

4,008

社区成员

发帖
与我相关
我的任务
社区描述
它是一种微软环境下的轻量级的解释型语言,它使用COM组件、WMI、WSH、ADSI访问系统中的元素,对系统进行管理。
社区管理员
  • vbScript社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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