CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  ATL/ActiveX/COM

结构指针如何传入COM组件中去

楼主DTH()2005-06-01 16:42:36 在 VC/MFC / ATL/ActiveX/COM 提问

就是下面的       lpPinGetData结构指针如何传入到CSPPIN_COM   中去  
  以下是调用COM组件的函数  
  WFSPINGETDATA *   lpPinGetData;  
  pIPin->WFPExecute_COM(hService,dwCommand,(VARIANT   *)lpPinGetData   ,dwTimeOut,(ULONG)hWnd,ReqID);  
   
  以下是COM组件的函数   lpCmdData是要传入的参数。  
  STDMETHODIMP   CSPPIN_COM::WFPExecute_COM(short   hService,   ULONG   dwCommand,   VARIANT   *   lpCmdData,   ULONG   dwTimeOut,   ULONG   hWnd,   ULONG   ReqID)  
   
   
  但我这样传入的的指针数据传送不对。请教能把结构指针传入到COM组件中去的方法。  
  问题点数:100、回复次数:11Top

1 楼WuOu(天堂*蓝珀湖*仰音*诚彦)回复于 2005-06-01 17:05:49 得分 0

UPTop

2 楼dongfa(一桶江湖( http://www.codelive.net ))回复于 2005-06-01 17:22:55 得分 0

如果是进程内,可以不使用   VARIANT    
   
  直接使用   void   *pCmdData  
  假设你的结构为CMDDATA  
   
  CMDDATA   *   =   (CMDDATA   *)pCmdData;  
  Top

3 楼sinall()回复于 2005-06-01 18:32:30 得分 0

进程内组件用long传地址,过去做强制类型转换。  
  比如:  
  STDMETHODIMP   CObj::WFPExecute_COM(long   lpCmdData)  
  {  
  //   TODO:   Add   your   implementation   code   here  
  struct   Date   *date=(struct   Date   *)lpCmdData;  
   
  return   S_OK;  
  }  
   
  void   CClientDlg::OnButton1()    
  {  
  //   TODO:   Add   your   control   notification   handler   code   here  
  ::CoInitialize(NULL);  
  {  
  struct   Date   date;  
   
  IObjPtr   pObj;  
  pObj.CreateInstance(__uuidof(Obj));  
  pObj->WFPExecute_COM((long)&date);  
  }  
  ::CoUninitialize();  
  }  
  Top

4 楼DTH()回复于 2005-06-01 21:56:16 得分 0

谢谢!但我这个是进程外的组件!  
  用以上的方法还是不行!  
  求达人解题!Top

5 楼dongfa(一桶江湖( http://www.codelive.net ))回复于 2005-06-02 13:11:39 得分 60

进程外不能直接传,使用SafeArray  
   
  VARIANT   *pVar   =   new   VARIANT;  
   
  VariantInit(pVar);  
  pVar->vt   =   VT_ARRAY   |   VT_UI1;  
   
  SAFEARRAYBOUND     rgsabound[1];  
  rgsabound[0].cElements   =   dwSize;   //   缓冲大小,也就是你结构的大小  
  rgsabound[0].lLbound       =   0;  
  pVar->parray   =   SafeArrayCreate(VT_UI1,   1,   rgsabound);  
  if(pVar->parray   !=   NULL)  
  {  
  void   *pArrayData   =   NULL;  
  if(SUCCEEDED(SafeArrayAccessData(pVar->parray,   &pArrayData)))  
  {  
                  //   pStructBuffer   结构数据指针  
  memcpy(pArrayData,   pStructBuffer,   dwSize);  
   
  ASSERT(lReal   ==   dwSize);  
  hr   =   SafeArrayUnaccessData(pVar->parray);  
  }  
  }  
   
   
  pIPin->WFPExecute_COM(hService,dwCommand,pVar,dwTimeOut,(ULONG)hWnd,ReqID);  
   
  Top

6 楼jiangsheng(蒋晟.Net[MVP])回复于 2005-06-02 13:51:30 得分 0

把结构封装成自动化对象来操作也可以Top

7 楼DTH()回复于 2005-06-02 15:02:04 得分 0

dongfa(一桶江湖(   http://adong2008.512j.com   ))    
  谢了我试试!  
   
  jiangsheng(蒋晟.MSMVP2004Jan)    
  你所说的方法能否给个例子,谢了!Top

8 楼jiangsheng(蒋晟.Net[MVP])回复于 2005-06-02 15:06:16 得分 0

http://msdn.microsoft.com/library/en-us/vclib/html/_mfcnotes_tn065.aspTop

9 楼DTH()回复于 2005-06-04 00:40:37 得分 0

小弟不才,以上的方法好像都不行,望达人向助!!!!!Top

10 楼sinall()回复于 2005-06-04 08:47:18 得分 40

dongfa(一桶江湖(   http://adong2008.512j.com   ))   办法可行。  
  短消息给我E-Mail,我给你发Demo。  
   
  IDL:  
  struct   _MyDate   {  
  int   num;  
  };  
   
  interface   IObj   :   IDispatch  
  {  
  [id(1),   helpstring("method   WFPExecute_COM")]   HRESULT   WFPExecute_COM(VARIANT   *pVar);  
  };  
   
  服务器端:  
  STDMETHODIMP   CObj::WFPExecute_COM(VARIANT   *pVar)  
  {  
  //   TODO:   Add   your   implementation   code   here  
  size_t   dwSize=sizeof(_MyDate);  
  _MyDate   StructBuffer;  
  HRESULT   hr;  
   
  if(pVar->parray   !=   NULL)  
  {  
  void   *pArrayData   =   NULL;  
  if(SUCCEEDED(SafeArrayAccessData(pVar->parray,   &pArrayData)))  
  {  
  //   pStructBuffer   结构数据指针  
  memcpy(&StructBuffer,   pArrayData,   dwSize);  
   
  hr   =   SafeArrayUnaccessData(pVar->parray);  
  }  
  }  
   
  char   msg[100];  
  sprintf(msg,"%d",StructBuffer.num);  
  MessageBox(NULL,msg,"",MB_OK);  
   
  return   S_OK;  
  }  
   
  客户端:  
  void   CClientDlg::OnButton1()    
  {  
  //   TODO:   Add   your   control   notification   handler   code   here  
  ::CoInitialize(NULL);  
  {  
  VARIANT   Var;  
  VARIANT   *pVar   =   &Var;  
   
  size_t   dwSize=sizeof(_MyDate);  
  _MyDate   StructBuffer;  
  HRESULT   hr;  
   
  StructBuffer.num=15;  
   
  VariantInit(pVar);  
  pVar->vt   =   VT_ARRAY   |   VT_UI1;  
   
  SAFEARRAYBOUND     rgsabound[1];  
  rgsabound[0].cElements   =   dwSize;   //   缓冲大小,也就是你结构的大小  
  rgsabound[0].lLbound       =   0;  
  pVar->parray   =   SafeArrayCreate(VT_UI1,   1,   rgsabound);  
  if(pVar->parray   !=   NULL)  
  {  
  void   *pArrayData   =   NULL;  
  if(SUCCEEDED(SafeArrayAccessData(pVar->parray,   &pArrayData)))  
  {  
  //   pStructBuffer   结构数据指针  
  memcpy(pArrayData,   &StructBuffer,   dwSize);  
   
  // ASSERT(lReal   ==   dwSize);  
  hr   =   SafeArrayUnaccessData(pVar->parray);  
  }  
  }  
   
  IObjPtr   pObj;  
  pObj.CreateInstance(__uuidof(Obj));  
  pObj->WFPExecute_COM(pVar);  
   
  }  
  ::CoUninitialize();  
  }  
  Top

11 楼dawndu(东南飞)回复于 2005-06-04 20:39:46 得分 0

SafeArray乃正途也Top

相关问题

  • 结构体指针
  • 结构指针的指针的问题?
  • 结构体的指针??
  • 指针和结构体
  • Mutex的问题,HANDLE不能用指针传入
  • 如何显示指针地址到Edit组件中
  • 有关WIN32_FIND_DATA结构的指针
  • 关于结构指针求救
  • 如何delete结构体指针?
  • 传递结构指针的问题

关键词

  • 指针
  • 组件
  • 结构
  • hr
  • 数据
  • pvar
  • wfpexecute
  • parraydata
  • structbuffer
  • 传入

得分解答快速导航

  • 帖主:DTH
  • dongfa
  • sinall

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo