刚刚开始第一个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包含中文).
请教各位.

解决方案 »

  1.   

    http://expert.csdn.net/Expert/topic/2997/2997237.xml?temp=9.804934E-02相同的问题
      

  2.   

    你的这个f()方法怎么写的呢?你跟进去看看有没有给这个结构赋值呢?还有vb6下是不行的,vb.net和c#下是没有问题的
      

  3.   

    f()肯定是给结构赋值了.我跟踪过了.
    现在在c#下也显示成乱码. 
    为什么在vb6.0下不行呢?我原先用的是 LPCSTR strX .在C#下好用.但在vb6.0时提示机构有不支持的自动化类型.现在我该用  BSTR strX vb6.0下已经不提示自动化类型的问题了.
    但显示出来的   strX 在C# 和vb6.0下都是乱码.我看书上说BSTR不是自动化类型吗? 为什么还会有乱码的问题呢?
    急啊
      

  4.   

    1st. 输出型参数为结构时,应该用指针的指针,即f(myInfo** info)
    2nd. 结构中的BSTR也应该由你的ActviceX分配内存,由调用者释放把你的f()方法贴上来,大家帮你看看
      

  5.   

    先谢谢诸位的提示.
    现将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;
    }
    }
      

  6.   

    更正一下上面的
    f(CString strFilter,myInfo** info)//strFilter 用于传递过虑字符串
    句原因的应是
    f(CString strFilter,myInfo* info)//strFilter 用于传递过虑字符串补充:
        上面代码的***.dll中的FindWareInfo()方法绝对的正确是返回了指针的值的.
    另外请教zhp80
    2nd. 结构中的BSTR也应该由你的ActviceX分配内存,由调用者释放
    该如何实现呢? 最好能给出c#和vb的代码. 谢谢了
      

  7.   

    1st. COM 中的字符串最好都用BSTR,所以CString strFilter 应为 BSTR strFilter2nd. 你的f()不过是将原来的WINAPI从新做了下COM封装,必要性有多大?3rd. hDelegateDll中FindWareInfo()(LPCSTR,WareInfo*)的原型是什么?结构WareInfo和你的结构 myInfo 一样吗?4th. 从你的定义 typedef bool (CALLBACK * FINDWAREINFO)(LPCSTR,WareInfo*); 上来看,FINDWAREINFO 应该是一个回调函数,你这样用对吗?
      

  8.   

    BSTR类型传出时要用SysAllocString分配空间
      

  9.   

    to zhp80
    1st.我的f() 方法返回的内容应该是正确的.我跟踪过了(通过监视内存).其中的info->strX在通过内存监视时返回的也是正确的字符串.
    所以我认为是否将 
    CString strFilter 改成 BSTR strFilter 不是关键.2nd.另外是否有必要重新封装成com 我认为还是有必要的.因为原先的.dll无法跨语言.而现在可以跨语言了.3sd.我的结构wareinfo和myinfo是一样的而且元素是一一对应的.唯一不同的是元素的类型.WareInfo 中的是 CString 而 myInfo 中的是 BSTR.以为1st.的原因我决定这一点也不应该是关键.4th.我不太明白回调函数的用途和意义.所有也很糊涂.我是参照别人的例子作的.请高手赐教.
      

  10.   

    我用 (LPCSTR)myInfo->strX 就可以将信息正确的转换过来.
    可这样的返回类型就是 LPCSTR 了 在vb下有类型不支持自动化的问题.
      

  11.   

    问题基本找到解决办法了 但有点笨
    CString strTemp;//临时变量用于保存临时的字符串
    strTemp=(LPCSTR)myInfo->strX;
    _bstr_t bstr(str);//构造一个bstr变量
    myInfo->strX=bstr;//重新为结构的元素赋值这样处理后在vb和c#中就正常了.
    我怀疑问题出在XXXX.dll中结构的元素类型和com中myInfo中类型不一致的问题.问题虽然有办法解决但方法很笨.因为我要对所有的自定义机构中的所有元素进行处理.代码太多了.谢谢各位的支持.