Передача аргумента [in,out] VARIANT* из JScript
От: Shire  
Дата: 18.06.03 12:22
Оценка:
Уважаемый All!

Вот тут мучил контрол MSWinsock.Winsock (поставляется с VB Ent. Edition) из JScript (WSH).
У него есть методы GetData и PeekData, которые принимают ссылку на VARIANT.

HRESULT xxxData(
    [in, out] VARIANT* data,
    [in, optional] VARIANT type,
    [in, optional] VARIANT maxLen);


Из VBScript всё замечательно, а JScript при передаче не изменяет переменную. Есть ли способ передать переменную на JScript, кроме написания своего переходника?
Если интересно, то код:

client.vbs:
dim bConnected
dim bSent
    bConnected=false
    bSent=false
dim    bDataReceived
    bDataReceived=false
dim    winsock
    Set winsock=WScript.CreateObject("MSWinsock.Winsock")
sub winsock_Connect
    WScript.Echo "Connected!"
    bConnected=true
end sub
sub winsock_SendComplete
    WScript.Echo "Sent!"
    bSent=true
end sub

sub winsock_DataArrival(bytTotal)
    WScript.Echo "Received:"
    WScript.Echo bytTotal
dim str
    winsock.GetData str,8 ' Всё замечательно!
    WScript.Echo str
    bDataReceived=true
end sub

    WScript.ConnectObject winsock,"winsock_"
    winsock.Connect "127.0.0.1",6789
    do while not (bConnected)
        WScript.Sleep 500
    Loop
    winsock.SendData "Client request..."
    do while not(bDataReceived)
        WScript.Sleep 500
    Loop
    winsock.Close


server.js

var    winsock=WScript.CreateObject("MSWinsock.Winsock");
var bClose=true;
function wsock_ConnectionRequest(reqId)
{
    WScript.Echo("accepting request");
    winsock.Close();
    winsock.Accept(reqId);
}
function wsock_DataArrival(bytTotal)
{
    WScript.Echo("Received:");
var    data="";
    WScript.Echo(bytTotal);
    winsock.GetData(data,8,bytTotal);// {вырезано цензурой} 
    WScript.Echo(data);
    winsock.SendData("Server response...");
}
function wsock_Error(number, desc, sCode, src, help, helpctx, cancelDisplay)
{
    WScript.Echo("Error: "+desc);
    bClose=false;
}
function wsock_Close()
{
    WScript.Echo("Connection closed.");
    bClose=false;
}
    WScript.ConnectObject(winsock,"wsock_");
    winsock.LocalPort=6789;
    winsock.Protocol=0;
    winsock.Listen();
    while(bClose)WScript.Sleep(500);


client.js

var bConnected=false;
var bSent=false;
var    bDataReceived=false;
var    winsock=WScript.CreateObject("MSWinsock.Winsock");
function wsock_Connect()
{
    WScript.Echo("Connected!");
    bConnected=true;
}
function wsock_SendComplete()
{
    WScript.Echo("Sent!");
    bSent=true;
}
function wsock_DataArrival(bytTotal)
{
    WScript.Echo("Received:");
    WScript.Echo(bytTotal);
var str=null;
    winsock.GetData(str,8);// {вырезано цензурой} 
    WScript.Echo(str);
    bDataReceived=true;
}
    WScript.ConnectObject(winsock,"wsock_");
    winsock.Connect("127.0.0.1",6789);
    while(!bConnected)WScript.Sleep(500);
    winsock.SendData("This is message!");
//    while(!bSent)WScript.Sleep(500);
    while(!bDataReceived)WScript.Sleep(500);
    winsock.Close();
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.