• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > VB中如何向VC编写的COM组件中传递指针和数组?急

VB中如何向VC编写的COM组件中传递指针和数组?急

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了 VB中如何向VC编写的COM组件中传递指针和数组?急等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: VB中如何向VC编写的COM组件中传递指针和数组? 急
描述:

我在VB中引用了一个用VC编写的COM组件,COM组件中一些接口函数的参数类型为char*、long*......类型,那么我在VB中调用该接口函数时参数类型应如何设置?
急......
先行谢过了!


解决方案1:

long *你给它传VC中定义的LONG 就行了。char * 在VB中没有对应的类型,
VB的字符串是BSTR型的,所以VC写的接口函数接口参数如果给VB用,不能用char *,应该用BSTR
一般来说,如果接口函数参数为 float *,int *
VB中都只需要直接Dim fParam as float
dim iParam as integer
接口函数.(fParam,iParam) 就可以了
数组的调用你可以看下面代码,我也是COM初学,写了个试了下,还能正常传递:
结构定义及函数代码(COM组件中的--ATL工程 )如下:
IDL:
  typedef [uuid(5536B87A-57D7-45e3-8A06-9B21BE40F5D2)] struct rcSimu
  {
         int iSimuNo;
BSTR strSimuName;
  }CRcSimu;
  typedef [uuid(425091B5-1E6F-4cfb-995C-18AFA20AFA84)] struct rcNode
  {
        int  iUniqueNo;
        float   fResult; 
        BSTR  strNodeName;
        SAFEARRAY(CRcSimu) aRcSimu;  
  }CNode;
 
函数:
/*自定义结构的ID*/
const GUID IID_STRUCT_SIMU = { 0x5536b87a, 0x57d7, 0x45e3, { 0x8a, 0x6, 0x9b, 0x21, 0xbe, 0x40, 0xf5, 0xd2 } };
const IID IID_STRUCT_NODE = { 0x425091b5, 0x1e6f, 0x4cfb, { 0x99, 0x5c, 0x18, 0xaf, 0xa2, 0xa, 0xfa, 0x84 } };
STDMETHODIMP CRcTest::GetStruct(SAFEARRAY **pNode)
{
   IRecordInfo* pRecordInfo=NULL;
   IRecordInfo *pSimuRecordInfo=NULL;
   HRESULT  hR=GetRecordInfoFromGuids(LIBID_RECON_ATLLib,
                      1,0,GetUserDefaultLCID(),IID_STRUCT_SIMU
                      ,&pSimuRecordInfo);
                             
   if(!SUCCEEDED(hR))
   {
      return FALSE;
   }
   hR=GetRecordInfoFromGuids(LIBID_RECON_ATLLib
                      ,1,0,GetUserDefaultLCID(),IID_STRUCT_NODE
                      ,&pRecordInfo);
   if(!SUCCEEDED(hR))
   {
      return FALSE;
   }
   /*创建大小为5个元素的自定义结构的数组--该结构内还有成员为数组*/
   *pNode=SafeArrayCreateVectorEx(VT_RECORD,0,5
                                 ,(void *)pRecordInfo);
   CNode *pData=0;
   hR=SafeArrayAccessData(*pNode,(void **)&pData);
   if(!SUCCEEDED(hR))
   {
      return FALSE;
   }
   CRcSimu *pSimu=NULL;
   for(int i=0;i<5;i++)
   {
      pData[i].iUniqueNo=i*100*(i+1);
      pData[i].fResult=2.2343+i;
      
      /*(CNode 结构的aRcSimu为数组类型) 动态创建aRcSimu的大小*/
      pData[i].aRcSimu=SafeArrayCreateVectorEx(VT_RECORD,0,3,(void *)pSimuRecordInfo);
      hR=SafeArrayAccessData(pData[i].aRcSimu,(void **)&pSimu);
      for(int j=0;j<3;j++)
      {
         pSimu[j].iSimuNo=(i+1)*10+(j+1);
      }
      SafeArrayUnaccessData(pData[i].aRcSimu);
   }
   SafeArrayUnaccessData(*pNode);
   pSimuRecordInfo->Release();
   pRecordInfo->Release();
   return S_OK;
}
下面是VB中的测试函数,在里面动态分配了数组大小,
    Dim aSimu() As RECON_ATLLib.rcSimu    
    Dim i, j, iSum As Integer
    Dim objRcTest As RECON_ATLLib.RcTest
    Set objRcTest = New RECON_ATLLib.RcTest
    Dim aNodes() As RECON_ATLLib.rcNode
    objRcTest.GetStruct aNodes
    i = UBound(aNodes)
    MsgBox "在VC里分配的数组大小为" + CStr(i+1)
    MsgBox aNodes(i).fResult
    i = UBound(aNodes(0).aRcSimu)
    For j = 0 To i
       MsgBox "节点1的aRcSimu(" + CStr(j) + ").iSimuNo=" 
       + CStr(aNodes(0).aRcSimu(j).iSimuNo)
    Next
    
    弹出对话框的内容一次为:
    “数组大小为5”
     “节点1的aRcSimu(0).iSimuNo=11"
     “节点1的aRcSimu(0).iSimuNo=12"
     “节点1的aRcSimu(0).iSimuNo=13"
    符合设想的功能。

解决方案2:

VC:LPSTR  VB:String  方法:VB中Declare ……
long 的在VC和VB中都用long 就行或者VC中用long VB中int 试试


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-06-05 一个有点困惑的问题VC高手请进
  • 2017-06-05 vc2005对话框上视频流播放的问题!
  • 2017-06-04 ActiveX莫名其妙不能注册了,这是什么原因啊。
  • 2017-06-04 有没有闲人帮我做游戏?
  • 2017-06-04 Error:有多个运算符"=="与这些操作数匹配,求大神相助啊
  • 2017-06-05 简单问题errorLNK2001
  • 2017-06-05 怎么获得游戏中的图形窗口句柄!???
  • 2017-06-04 com如何发送能被别的程序得到的消息和事件?
  • 2017-06-04 DLL文件怎样转换成为网上可以自动下载CAB文件????
  • 2017-06-04 关于接口指针创建的问题

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 兄弟们,有没有直接从DLL中查看类细节的工具
    • BHO如何实现自动点击button?
    • 我想定义一个可变长度的字符串。
    • 如何动态创建控件类对象问题。
    • VB中的IsNothing在VC中要如何表達呢
    • 用不用多线程
    • 急~~MFC中如何在ListBox上显示位图??
    • 用VS2005开发ATL,用了连接点之后发现无法生成代码到头文件,也没有Fire_函数
    • 请能给我讲解一下堆栈与堆!!!
    • 一个在CS游戏里使用钩子并模拟鼠标事件的问题

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有