ActiveX的属性用VB可以调用成功,VC调用出错?

巍巍清风 2007-06-21 08:46:09
有一个第三方的ActiveX控件,有一个属性返回一个 BSTR 类型的字符串,使用VB调用它的时候,完全正常,返回的字符串是ANSI的字符串。在VC里调用它的时候,有些字符竟然显示成了'?'号,比如:本来应该是 "g123458 b2321" 的,得到的结果却是 "?23458 ?321"。

奇哉怪哉!从现象上看像是UNICODE相关的错误,然而不管是不是定义了 _UNICODE 符号,都仍然返回问号。而且,VB能得到正常返回值的,VC没理由不行。实在不明白错在哪里。头发都急白了…

属性在IDL里的声明如下:
[id(0x0000001b), propget]
BSTR rCode();

在VC里自动生成的封装为:
CString GetRCode();

对调用的封装实现为:
CString CPpocx::GetRCode()
{
CString result;
InvokeHelper(0x1b, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
return result;
}

经跟踪,执行了InvokeHelper后,result的值就带了问号的,已经不正常了。


哪位大虾遇到过类似的问题?恳请留下指导意见,不胜感激!

给不了太多分,如果经过指导得以解决,另开贴赠分,先谢谢了!
...全文
279 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
巍巍清风 2007-07-05
  • 打赏
  • 举报
回复
看来CSDN没落了,竟然没有高人能解决这个问题。
不过还是谢谢大家。
巍巍清风 2007-06-29
  • 打赏
  • 举报
回复
不好意思,没明白楼上的在说什么
巍巍清风 2007-06-27
  • 打赏
  • 举报
回复
不好意思,回头看了看,原来说的是二楼的方法。

那行不通的,VC生成的ActiveX 的封装就定义死了是 CString 类型,内部是使用 VARIANT 类型传出。跟踪过 VARIANT 中的内容,同样是错的。所以不关 CString 的事。
巍巍清风 2007-06-27
  • 打赏
  • 举报
回复
谢谢 微笑!
你提供的网址打不开,能详细说一下DentistryDoctor 的方法吗?
hongmosuyier 2007-06-27
  • 打赏
  • 举报
回复
Private Sub Form_Load()

vgctrl1.Design ""

End Sub

这句程序执行后,将在控件中设计一个新的Visual Graph视图文件
放一个按钮Command1,双击这个按钮,编写下面的代码

Private Sub Command1_Click()

Dim ASheet As ISheet
Dim AText As IText
Set ASheet = vgctrl1.ActiveSheet
Set AText = ASheet.AddUnit("Text", 0, 0, 100, 100)
AText.Text = "Hello World!"

End Sub

再放一个按钮Command2,双击这个按钮,编写下面的代码

Private Sub Command2_Click()

vgctrl1.NewUnit "Line", 0

End Sub

右键事件。

Private Sub vgctrl1_OnRButtonDown(ByVal X As Double, ByVal Y As Double)

Dim ASheet As ISheet
Dim AUnit As IUnit
Set ASheet = vgctrl1.ActiveSheet
Set AUnit = ASheet.UnitAtPoint(X, Y, Nothing)
MsgBox "您在图形:" + AUnit.Name + " 上按下了右键!"

End Sub

这里好像有个漏洞:::单击Command1按钮创建一个图形,那么这里的AUnit就是空,将使得最后一行程序出错!!我这个也是以前遇到这个问题 去http://www.visual-graph.com上查来的
写出来 请高手看看
ralphvsclark 2007-06-26
  • 打赏
  • 举报
回复
你试试DentistryDoctor(Data Recovery -- http://www.powerdatarecovery.com)的方法
我觉得问题就出在这里
巍巍清风 2007-06-26
  • 打赏
  • 举报
回复
怎么没人发话了?
巍巍清风 2007-06-22
  • 打赏
  • 举报
回复
对于调用 BSTR rCode ( 在MFC中被封装为 CString GetRCode() ) 这样一个属性,如何得到它的字节数组呢?

看过MFC内部调用接收到的 VARIANT 的值的内容,那些个问号确实是'?'的ASCII, 63 。这样的话,即使从返回后的CString得到它的字节数组,内容也不会是正确值,只会是63.

如果是Unicode的话,VB调用可以正常得到结果,而且得到的结果是很普通的字符串,只有英文字母和数字。这解释不通。
xiaoyuzi 2007-06-22
  • 打赏
  • 举报
回复
怀疑有里头有日文这样的unicode字符。建议把返回字符串存到字节数组,然后一个字节一个字节判断它是否是双字节字符的前导字符(IsDBCSLeadByte可以判断),是的话,两个字节为一个字符
巍巍清风 2007-06-22
  • 打赏
  • 举报
回复
跟踪了 MFC 处理ActiveX调用的OLEDISP类库,它内部是使用 VARIANT 接收返回值的,然后再封装成 CString 的。所以不能改用CComBSTR 或 _bstr_t。

并且由于接收到的 VARIANT 中的BSTR的值已经是错了的,所以不管换成什么类型,都不能解决问题。
BimyuIO 2007-06-22
  • 打赏
  • 举报
回复
变通办法:拿VB编写个控件封装一下此控件,然后vc调用vb的控件
我原来有个vc编的控件,pb死活调用不对,,调用vb的就没问题,后来这样干的。
jxufeng 2007-06-21
  • 打赏
  • 举报
回复
改成CComBSTR a;或者_bstr_t a;
InvokeHelper(0x1b, DISPATCH_PROPERTYGET, VT_BSTR, &a, NULL);
CString res;
res=(CString)a;
试试看
巍巍清风 2007-06-21
  • 打赏
  • 举报
回复
CString会自己处理BSTR的
DentistryDoctor 2007-06-21
  • 打赏
  • 举报
回复
要求的参数类型是BSTR*? 你为何传入CString*?

3,245

社区成员

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

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