请问如何从外界向ActiveX控件里写入值呢?

developCpp 2005-11-21 04:12:09
我用向导添加了一个方法
BOOL CHIDUSBCtrl::Write(const VARIANT FAR& Data)
{
// TODO: Add your dispatch handler code here
if(!IsOpen())
{
return FALSE;
}
LONG length;//数据长度
COleSafeArray safearray_data;
safearray_data=Data; //运行到这里时程序报错误

//忽略上面的错误,运行下面的代码时程序还是报错,
length=safearray_data.GetOneDimSize();

//再忽略上面的错误,运行下面代码没有错误了
BYTE *Buf=new BYTE[length+1];
for(LONG i=0;i<length;i++)
safearray_data.GetElement(&i,Buf+i);
DWORD dw;
OVERLAPPED overlap;
memset(&overlap, 0, sizeof(OVERLAPPED));

//向设备写入一个字符串
BOOL bResult=WriteFile(m_hDevice, Buf, length, &dw, &overlap);
delete Buf;
return bResult;
}
如上方法,功能是向设备写入一个字符串,就像MSComm控件写串口的功能一样

请问其中表注的两个错误怎么解决呢
不胜感激!
...全文
129 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
developCpp 2005-11-22
  • 打赏
  • 举报
回复
还是搞不定
可能是接口定义错误
从外界向ActiveX控件传入一个VARIANT值,参数应该用VARIANT还是VARIANT*类型的呢?
我就使用MFC ActiveX Wizard添加的方法,
好像两个都不行喔!
怎么单步调试ActiveX程序呢?
基本的问题,分不够再加
请做过ActiveX开发的大侠帮帮忙喔

不胜感激!
zxyjyzxyjy 2005-11-22
  • 打赏
  • 举报
回复
COleVariant的使用,查帮助
zxyjyzxyjy 2005-11-22
  • 打赏
  • 举报
回复
把:
COleSafeArray safearray_data;
改为:
COleVariant safearray_data;
developCpp 2005-11-22
  • 打赏
  • 举报
回复
暈了
把簡單的問題複雜化了
呵呵
謝謝
zxyjyzxyjy 2005-11-22
  • 打赏
  • 举报
回复
注意这里仅对传入的字符中没有NULL字符的情况,否则第一个NULL后的没有。
zxyjyzxyjy 2005-11-22
  • 打赏
  • 举报
回复
不知你是怎么做的,如果仅写入字符串之类的东西,如下就能实现。
BOOL CHIDUSBCtrl::Write(const VARIANT FAR& Data)
{
// TODO: Add your dispatch handler code here
COleVariant val(Data);
CString str;
if(val.vt == VT_BSTR)
{
str = val.bstrVal;
AfxMessageBox(str);//在VB中会显示这个字符串的。
}
return TRUE;
}
这里仅处理了接收数据并保存到本函数中的过程。
developCpp 2005-11-21
  • 打赏
  • 举报
回复
请问哪里有MSComm控件的源代码下载呀
或者是和差不多的ActiveX控件的源程序
不胜感激!
developCpp 2005-11-21
  • 打赏
  • 举报
回复
编译是没有任何错误的
我用VB测试这个控件的时候
报的错误就是简单的程序严重错误, 选择: 1终止 2重试 3忽略

我控件断点不知道怎么搞,我是这样的
BOOL CHIDUSBCtrl::Write(const VARIANT FAR& Data)
{
// TODO: Add your dispatch handler code here
if(!IsOpen())
{
return FALSE;
}
LONG length;//数据长度
COleSafeArray safearray_data;
MessageBox(“1”);
safearray_data=Data; //运行到这里时程序报错误
MessageBox(“2”);
//忽略上面的错误,运行下面的代码时程序还是报错,
length=safearray_data.GetOneDimSize();
MessageBox(“3”);
//再忽略上面的错误,运行下面代码没有错误了
BYTE *Buf=new BYTE[length+1];
for(LONG i=0;i<length;i++)
safearray_data.GetElement(&i,Buf+i);
DWORD dw;
OVERLAPPED overlap;
memset(&overlap, 0, sizeof(OVERLAPPED));

//向设备写入一个字符串
BOOL bResult=WriteFile(m_hDevice, Buf, length, &dw, &overlap);
delete Buf;
return bResult;
}
测试在
MessageBox(“1”);
之后,报严重错误,然后点 [忽略]
MessageBox(“2”);
还是错误,继续点忽略
然后MessageBox(“3”);
然后没有错误了
快乐鹦鹉 2005-11-21
  • 打赏
  • 举报
回复
safearray_data=Data; //运行到这里时程序报错误
程序报什么错误啊?断点停在哪个语句?
developCpp 2005-11-21
  • 打赏
  • 举报
回复
error C2664: 'VariantCopy' : cannot convert parameter 2 from 'const struct tagVARIANT *' to 'struct tagVARIANT *'

我對VARIANT也不是很熟悉的哦
請大俠幫幫我喔

不勝感激!
developCpp 2005-11-21
  • 打赏
  • 举报
回复
我用的MFC ActiveX Control Wizard
添加方法 Write 参数是VARIANT类型

我用VB写的测试程序
先打开设备
然后写入一个字符串
假设控件名字是HIDUSB1

HIDUSB1.Open

HIDUSB1.Write "abcdef"

我现在试一下这个方法
不胜感激!
developCpp 2005-11-21
  • 打赏
  • 举报
回复
我用的MFC ActiveX Control Wizard
添加方法 Write 參數是VARIANT類型

我用VB寫的測試程序
先打開設備
然後寫入一個字串
假設控件名字是HIDUSB1

HIDUSB1.Open

HIDUSB1.Write "abcdef"
快乐鹦鹉 2005-11-21
  • 打赏
  • 举报
回复
传进来的参数有问题吧。用HRESULT VariantCopy(
VARIANTARG * pvargDest,
VARIANTARG * pvargSrc
);试试,能不能完成复制啊。
你怎么调用这个接口的?

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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