随笔 - 41  文章 - 2 评论 - 0 阅读 - 52537
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

在做ocx 控件的时候,函数需要返回一个字符串类型的数组,代码如下:

复制代码
VARIANT CreadDllCtrl::GetarcData(void)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    VARIANT vaResult;
    VariantInit(&vaResult);
    SAFEARRAY * psa;

    SAFEARRAYBOUND rgsabound[1];   
    CComVariant cv;
    CComBSTR bstrTmp;

    long nIndex;



    rgsabound[0].lLbound = 0;

    rgsabound[0].cElements = dxfR.m_tarcData.size();
    //psa = SafeArrayCreate(VT_BSTR, 1, rgsabound);

    psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);

    nIndex = 0;

    list<Tag_CADArc> ::iterator it;
    double pointx,pointy,pointz,r,stAngle,edAnge;
    CString strTmp;
    LONG nCount = 0;
    for( it= dxfR.m_tarcData.begin();it!=dxfR.m_tarcData.end();it++)
    {
         CString str;
        //cout<<*it<<"\t";
        strTmp.Empty();
        pointx = (*it).tCen.x; 
        pointy = (*it).tCen.y;
        pointz = (*it).tCen.z;
        r = (*it).radius;
        stAngle = (*it).stAngle;
        edAnge = (*it).edAngle;

        str.Format(_T("%lf,"),pointx);
        strTmp = str;
        str.Format(_T("%lf,"),pointy);
        strTmp = strTmp + str;
        str.Format(_T("%lf,"),pointz);
        strTmp = strTmp + str;
        str.Format(_T("%lf,"),r);
        strTmp = strTmp + str;

        str.Format(_T("%lf,"),stAngle);
        strTmp = strTmp + str;

        str.Format(_T("%lf"),edAnge);
        strTmp = strTmp + str;


        bstrTmp = strTmp.AllocSysString();
        cv = bstrTmp;

        //SafeArrayPutElement(psa, &nCount,bstrTmp);
        SafeArrayPutElement(psa, &nCount,&cv);

        nCount++;
    }

       //vaResult.vt = VT_ARRAY|VT_BSTR;

    vaResult.vt = VT_ARRAY|VT_VARIANT;

    vaResult.parray = psa;

    // TODO: Add your dispatch handler code here

    return vaResult;
}
复制代码

本来是用的上面标红的字体的代码,意思就是创建一个VARIANT 类型,这个类型是个BSTR类型的数组;但是在VBS 里面调用该函数的时候,使用变量接收返回的数组,总是

报,类型不匹配的错误。

 

最后发现,要创建的VARINAT 的数组类型应该是VT_ARRAY|VT_VARIANT ,也就是把VT_BSTR 换成VT_VARIANT ,再运行就正确了;

 

参考:

https://blog.csdn.net/Python/article/details/2568849?utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-2.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-2.nonecase

 

http://www.coder100.com/index/index/content/id/317915

posted on   lazybee  阅读(279)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示