一个关于接口中BSTR的问题.在vb和c#中调用后返回的类型不正确.不知道为什么.

yaoyuhang 2004-05-08 03:40:03
刚刚开始第一个ActviceX工程.定义了一些自定义结构.
typedef struct myInfo
{
BSTR strX;
BSTR strY;
}
有一个方法 f(myInfo* info)返回该结构.
在vb 和 c#中引用该自定义结构.
dim info as XXXX.lib.myInfo
f(info)
msgBox info.strX
返回的info.strX是乱码.不知为何.在C#中也是如此.(strX包含中文).
请教各位.
...全文
120 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaoyuhang 2004-05-10
  • 打赏
  • 举报
回复
to zhp80
1st.我的f() 方法返回的内容应该是正确的.我跟踪过了(通过监视内存).其中的info->strX在通过内存监视时返回的也是正确的字符串.
所以我认为是否将
CString strFilter 改成 BSTR strFilter 不是关键.

2nd.另外是否有必要重新封装成com 我认为还是有必要的.因为原先的.dll无法跨语言.而现在可以跨语言了.

3sd.我的结构wareinfo和myinfo是一样的而且元素是一一对应的.唯一不同的是元素的类型.WareInfo 中的是 CString 而 myInfo 中的是 BSTR.以为1st.的原因我决定这一点也不应该是关键.

4th.我不太明白回调函数的用途和意义.所有也很糊涂.我是参照别人的例子作的.

请高手赐教.
XXandOO 2004-05-10
  • 打赏
  • 举报
回复
BSTR类型传出时要用SysAllocString分配空间
zhp80 2004-05-10
  • 打赏
  • 举报
回复
1st. COM 中的字符串最好都用BSTR,所以CString strFilter 应为 BSTR strFilter

2nd. 你的f()不过是将原来的WINAPI从新做了下COM封装,必要性有多大?

3rd. hDelegateDll中FindWareInfo()(LPCSTR,WareInfo*)的原型是什么?结构WareInfo和你的结构 myInfo 一样吗?

4th. 从你的定义 typedef bool (CALLBACK * FINDWAREINFO)(LPCSTR,WareInfo*); 上来看,FINDWAREINFO 应该是一个回调函数,你这样用对吗?
yaoyuhang 2004-05-10
  • 打赏
  • 举报
回复
问题基本找到解决办法了 但有点笨
CString strTemp;//临时变量用于保存临时的字符串
strTemp=(LPCSTR)myInfo->strX;
_bstr_t bstr(str);//构造一个bstr变量
myInfo->strX=bstr;//重新为结构的元素赋值

这样处理后在vb和c#中就正常了.
我怀疑问题出在XXXX.dll中结构的元素类型和com中myInfo中类型不一致的问题.

问题虽然有办法解决但方法很笨.因为我要对所有的自定义机构中的所有元素进行处理.代码太多了.

谢谢各位的支持.
yaoyuhang 2004-05-10
  • 打赏
  • 举报
回复
我用 (LPCSTR)myInfo->strX 就可以将信息正确的转换过来.
可这样的返回类型就是 LPCSTR 了 在vb下有类型不支持自动化的问题.
yaoyuhang 2004-05-09
  • 打赏
  • 举报
回复
更正一下上面的
f(CString strFilter,myInfo** info)//strFilter 用于传递过虑字符串
句原因的应是
f(CString strFilter,myInfo* info)//strFilter 用于传递过虑字符串

补充:
上面代码的***.dll中的FindWareInfo()方法绝对的正确是返回了指针的值的.


另外请教zhp80
2nd. 结构中的BSTR也应该由你的ActviceX分配内存,由调用者释放
该如何实现呢? 最好能给出c#和vb的代码. 谢谢了

yaoyuhang 2004-05-09
  • 打赏
  • 举报
回复
先谢谢诸位的提示.
现将f()的方法简要的帖出.希望高手指点.
1.我的f()方法调用***.dll(VC6.0的扩展动态库)文件中的一个方法来装填 *info
f(CString strFilter,myInfo** info)//strFilter 用于传递过虑字符串
{
HINSTRANCE hDelegateDll;//用于保存***.dll句柄
hDelegateDll=AfxLoadLibrary("***.dll");
typedef bool (CALLBACK * FINDWAREINFO)(LPCSTR,WareInfo*);
FINDWAREINFO FindWareInfo;
FindWareInfo=(FINDWAREINFO)GetProcAddress(hDelegateDll,"FindWareInfo");
if(FindWareInfo!=NULL)
{
if(FindWareInfo(strFilter,info))
return S_OK;
else
return S_FALSE;
}
else
{
AfxMessageBox("调用FindWareInfo函数错误");
return S_FALSE;
}
}
zhp80 2004-05-09
  • 打赏
  • 举报
回复
1st. 输出型参数为结构时,应该用指针的指针,即f(myInfo** info)
2nd. 结构中的BSTR也应该由你的ActviceX分配内存,由调用者释放

把你的f()方法贴上来,大家帮你看看
yaoyuhang 2004-05-09
  • 打赏
  • 举报
回复
f()肯定是给结构赋值了.我跟踪过了.
现在在c#下也显示成乱码.
为什么在vb6.0下不行呢?

我原先用的是 LPCSTR strX .在C#下好用.但在vb6.0时提示机构有不支持的自动化类型.现在我该用 BSTR strX vb6.0下已经不提示自动化类型的问题了.
但显示出来的 strX 在C# 和vb6.0下都是乱码.

我看书上说BSTR不是自动化类型吗? 为什么还会有乱码的问题呢?


急啊
wangweixing2000 2004-05-09
  • 打赏
  • 举报
回复
你的这个f()方法怎么写的呢?你跟进去看看有没有给这个结构赋值呢?还有vb6下是不行的,vb.net和c#下是没有问题的
yaoyuhang 2004-05-09
  • 打赏
  • 举报
回复
自己up
meng18106 2004-05-08
  • 打赏
  • 举报
回复
up
yaoyuhang 2004-05-08
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2997/2997237.xml?temp=9.804934E-02

相同的问题

3,245

社区成员

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

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