【发布时间】:2017-01-20 16:23:41
【问题描述】:
我在 C++ Builder Borland 中制作了一个 OCX。正如我所描述的,我的 OCX 具有以下功能:
- 登录
- 写
- 阅读
- 调试输出
- GetVal
我在我的 c# 应用程序中使用这个 OCX。在 c# 方面,我有一个按钮和列表框。该按钮从 OCX 调用 login 方法,列表框显示此方法的输出。
在 OCX 端,login 方法为服务器(使用套接字编程)创建一个命令以获取身份验证。然后调用Write 函数写入套接字。然后从套接字获取响应并调用Read 函数来读取套接字响应。
Read 方法读取结果并将其发送到DebugOutput 以调试输出流并调用GetVal 以查找最后的主服务器响应。然后他们将他们的参数传递给彼此。毕竟 C# 端显示了登录方法的结果 (SUCCESS | FAIL )。
我使用了 BSTR。 (我在 stackoverflow 和 MSDN 上阅读了有关 BSTR 的主题,但我认为我的解决方案并没有很好地理解它)。这些是我在 OCX 端的代码:
BSTR STDMETHODCALLTYPE TVImpl::Login(BSTR PassWord)
{
wchar_t wcs1[500];
Var *var=new Var();
//here make the command
...................
//get the server response to show to user
BSTR read=::SysAllocString(Write(wcs1));
if(read!=NULL) ::SysFreeString(read);
return read;
}
BSTR STDMETHODCALLTYPE TVImpl::Read()
{
BSTR str ;
try
{
IdTCPClient1->ReadTimeout=100;
str =::SysAllocString( IdTCPClient1->IOHandler->ReadLn().c_str());
}
catch(Exception &e)
{
str= e.Message.c_str();
}
str=(DebugOutput(str));
return str;
}
BSTR STDMETHODCALLTYPE TVImpl::Write(BSTR str)
{
IdTCPClient1->IOHandler->WriteLn(str) ;
BSTR str2=::SysAllocString(L"TST");
str2=Read();
return str2;
}
BSTR STDMETHODCALLTYPE TVImpl::GetVal(BSTR st,BSTR ValTyp)
{
BSTR res;
AnsiString stAnsi;
//Do some thing with st and save it to stAnsi
.................
res=(BSTR)WideString(stAnsi);
return ::SysAllocString(res);
}
BSTR STDMETHODCALLTYPE TVImpl::DebugOutput(BSTR st)
{
Var *val=new Var();
BSTR res;
res=GetVal(st,val->CMD_CMD);
if(res==val->CMD_AUTHENTICATE)
res=GetVal(st,val->XPassword);
return res;
}
在 C3 代码中它挂起。我知道我的问题是使用 sysAllocString。但是当我在每种方法中为每个方法使用 ::sysFreestring 时,我的 C# 代码再次挂起。
这是我的 C# 代码:
private void button4_Click(object sender, EventArgs e)
{
VinSockCmplt.Vin vin = new Vin();
listBox1.Items.Add(vin.Login("1234"));
}
【问题讨论】:
-
所以你的 c# 代码挂了,但你还没有显示出来......
-
没有必要粗鲁。
-
对不起,我没有恶意
-
您忘记使用 ::sysFressstring。
-
我说。这是一个悬而未决的收获。