• 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 > 请教c++/com高手:在多线程调用IDispatch::invoke会报错误问题,请告诉原因!!

请教c++/com高手:在多线程调用IDispatch::invoke会报错误问题,请告诉原因!!

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

佚名通过本文主要向大家介绍了请教c++/com高手:在多线程调用IDispatch::invoke会报错误问题,请告诉原因!!等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 请教c++/com高手:在多线程调用IDispatch::invoke会报错误问题,请告诉原因!!
描述:

现有如下需求:
知道对象IDispatch接口,要求执行里面的相应的函数。
我们知道可以使用IDispatch::invoke,不使用多线程的时候没有什么问题
但是为什么我在多线程中调用IDispatch::invoke的时候会报错,没有错误原因。
请高手指点。部分原代码如下:
this->Lock();
hr=::CLSIDFromProgID(L"MyObject",&clsid);
if(FAILED(hr)){  
        ::MessageBox(NULL,  "获取clsid失败!","Error",  0x10010);
_exit(0);
}
hr  =  CoCreateInstance(clsid,  NULL,  CLSCTX_LOCAL_SERVER,    
                                                       IID_IDispatch,  (void  **)&pWinccOjbect);  
    if(FAILED(hr)){  
        ::MessageBox(NULL,  "创建实例失败 !","Error",  0x10010);
_exit(0);
}
dispidNamed = DISPID_PROPERTYPUT;
ptName = L"GetValue";
// Convert down to ANSI
    WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);
// Get DISPID for name passed...
     hr = pWinccOjbect->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, 
                                &dispID);
     if(FAILED(hr)) {
            sprintf(buf, 
                    "IDispatch::GetIDsOfNames(\"%s\") failed w/err0x%08lx",
                    szName, hr);
            MessageBox(NULL, buf, "AutoWrap()", 0x10010);
            _exit(0);
     }
char * rlValue = "";
//初始化输入变量x
VARIANT  result;//输出变量
    VariantInit(&result);  
    VARIANT  x;  
    x.vt  =  VT_BSTR;  
    x.bstrVal  =(unsigned short*)_com_util::ConvertStringToBSTR(key);  //bstr字符类型
//
//
DISPPARAMS dp = { NULL, NULL, 0, 0 };
VARIANT *pArgs = new VARIANT[2];
pArgs[0]=x;
dp.cArgs = 1;    
dp.rgvarg = pArgs;
// Handle special-case for property-puts!
    if(DISPATCH_METHOD & DISPATCH_PROPERTYPUT) {
          dp.cNamedArgs = 1;
          dp.rgdispidNamedArgs = &dispidNamed;
    }
EXCEPINFO excep;
UINT err;
// Make the call!
    hr = pWinccOjbect->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, 
                       &dp, &result, &excep, &err);
    if(FAILED(hr)) {
          sprintf(buf,
                  "IDispatch::Invoke(\"%s\"=%08lx) failed w/err 0x%08lx", 
                    szName, dispID, hr);
  //
          MessageBox(NULL, buf, "AutoWrap()", 0x10010);
          _exit(0);
      }
/*
typedef struct FARSTRUCT tagEXCEPINFO {
unsigned short wCode;      // An error code describing the error.
Unsigned short wReserved;
BSTR bstrSource;            // Source of the exception.
BSTR bstrDescription;      // Textual description of the error.
BSTR bstrHelpFile;         // Help file path.
Unsigned long dwHelpContext;   // Help context ID.
Void FAR* pvReserved;
// Pointer to function that fills in Help and description info.
HRESULT (STDAPICALLTYPE FAR* pfnDeferredFillIn)
   (struct tagEXCEPINFO FAR*);
RETURN VALUE return value;   // A return value describing the error.
} EXCEPINFO, FAR* LPEXCEPINFO;
*///_com_util::ConvertBSTRToString(result.bstrVal)
/*char* error = new char[1024];
sprintf(error,"%d",excep.wCode);
MessageBox(NULL,error,"wCode",0);
sprintf(error,"%d",excep.wReserved);
MessageBox(NULL,error,"wReserved",0);
error = _com_util::ConvertBSTRToString(excep.bstrSource);
MessageBox(NULL,error,"bstrSource",0);
error = _com_util::ConvertBSTRToString(excep.bstrDescription);
MessageBox(NULL,error,"bstrDescription",0);
error = _com_util::ConvertBSTRToString(excep.bstrHelpFile);
MessageBox(NULL,error,"bstrHelpFile",0);
*/
VARTYPE vt = result.vt;
  switch(vt)
  {
case VT_I4:
{
//MessageBox(NULL,"长整型转换成字符","infor",0);
//ltoa(result.lVal,rlValue,10);
long ln=result.lVal;
rlValue = new char[128];
sprintf(rlValue,"%d",ln);
//MessageBox(NULL,"长整型转换成字符","infor",0);
}
break;
case VT_UI1:
{
//MessageBox(NULL,"unsigned char","unsigned char",0);
rlValue = new char[128];//test done
sprintf(rlValue,"%c",result.bVal);
//MessageBox(NULL,"unsigned char","unsigned char",0);
}
break;
case VT_I2:

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

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

  • 请教c++/com高手:在多线程调用IDispatch::invoke会报错误问题,请告诉原因!!
  • 请教c++/com高手:在多线程调用IDispatch::invoke会报错误问题,请告诉原因!!

相关文章

  • 2017-06-04 我使用VC做了个DLL,参数为BSTRs,在PB中调用,参数为A1C1,可在调用过程中DLL中显示为AC空格空格,着是为什么?
  • 2017-06-05 IE11使用IHTMLDocument2设置编码问题
  • 2017-06-04 关于com的让你困惑的恶心的几个问题
  • 2017-06-04 控件嵌入IE,如何全屏?解决问题送500分
  • 2017-06-04 通过WPF实现的C#调用COM组件的事件
  • 2017-06-05 求助一个DLL调用问题
  • 2017-06-04 DCOM如何走Internet?
  • 2017-06-05 各位老大这个是什么问题啊?
  • 2017-06-05 windows核心编程15章中MemReset代码中的问题????
  • 2017-06-04 关于NetMeetingSDK的问题

文章分类

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

最近更新的内容

    • MFC怎么编程选定一个输入通道?MIXERCONTROL_CONTROLTYPE_MUX
    • 求WIN32多线程程序设计候捷的附带光盘源码!!!!!!!!!!高分
    • 我隐式调用lib,为什么出现“没有找到xxdll,因此这个应用程序未能启动,重新安装应用程序会修复此问题”
    • 怎样在dll中定义全局变量?
    • 新手问题进来都有分
    • 关于套间线程的一段论述不是很明白
    • 为什么MFCregulardll导出函数时不能在_declspecdllexport前添加extern"c"??
    • 写了个DLL其中需要加载一些数据,所以调用起来很慢,有没办法让其加载一次后,供所有用户使用???
    • 无窗口ATL使用定时器
    • 自己编写的浏览器程序点击下载的链接有时会出来一个空白页面,然后弹出系统的文件保存对话框,点击取消后怎么获取消息关闭这个空白页面?

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

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