CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  ATL/ActiveX/COM

为什么我的hr=CoInitialize(NULL)总是返回S_FALSE

楼主jifeng1123(几风)2004-12-04 11:02:43 在 VC/MFC / ATL/ActiveX/COM 提问

我只不过在对话框上加了个datagrid的activex控件,其他什么也没做,而我用hr=CoInitialize(NULL)时总是返回S_FALSE,搞得我非常郁闷!  
   
   
  那位兄弟姐妹知道,给我一点帮助 问题点数:20、回复次数:10Top

1 楼EnochShen(小疯子:真的好菜—知耻而后勇!)回复于 2004-12-04 11:22:30 得分 0

The   COM   library   is   already   initialized   on   this   apartmentTop

2 楼jifeng1123(几风)回复于 2004-12-04 11:54:15 得分 0

怎么解决啊!Top

3 楼bobob(静思)回复于 2004-12-04 12:24:29 得分 5

如果你确信还没有初始化过com,那你就用GetLastError看看是什么错误Top

4 楼Semigod()回复于 2004-12-04 13:14:46 得分 5

同意楼上,用GetLastError得到错误码,然后用VC的ErrorLookup看一下是什么意思就好解决了Top

5 楼jifeng1123(几风)回复于 2004-12-04 13:57:30 得分 0

LPVOID   lpMsgBuf;    
    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER   |   FORMAT_MESSAGE_FROM_SYSTEM   |   FORMAT_MESSAGE_IGNORE_INSERTS,    
            NULL,    
            ::GetLastError(),    
            MAKELANGID(LANG_NEUTRAL,   SUBLANG_DEFAULT),   //   Default   language    
            (LPTSTR)   &lpMsgBuf,    
            0,    
            NULL    
          );    
          MessageBox((LPCTSTR)lpMsgBuf,"Error",MB_ICONWARNING);    
   
  我用了getlasterror后,竟然返回的是:“操作成功执行”!  
  大家帮我看一下我的代码有没有写错Top

6 楼hushuangyan74()回复于 2004-12-05 09:11:49 得分 0

使用datagrid的activex控件,就不要用hr=CoInitialize(NULL),就可以使用ActiveX控件。  
  如果是使用一般的COM组件,就要在InitInstance()中加::CoInitialize(NULL),在ExitInstance()中加::CoUninitialize()。你试试!  
   
  Top

7 楼IloveAzhu(AJUN)回复于 2004-12-05 09:35:07 得分 5

你的COM组件估计已经被那个ActiveX控件调用,不需要你再调用了。  
  还有这个错误,是无法用GetLastError()监测到的,只是由返回值确定。  
  以下是MSDN的解释:  
  Return   Values  
  This   function   supports   the   standard   return   values   E_INVALIDARG,   E_OUTOFMEMORY,   and   E_UNEXPECTED,   as   well   as   the   following:    
   
  S_OK    
  The   COM   library   was   initialized   successfully   on   this   thread.    
   
  /****************  
  S_FALSE    
  The   COM   library   is   already   initialized   on   this   thread.    
  ****************/  
   
  RPC_E_CHANGED_MODE    
  A   previous   call   to   CoInitializeEx   specified   the   concurrency   model   for   this   thread   as   multithread   apartment   (MTA).   If   running   Windows   2000,   this   could   also   mean   that   a   change   from   neutral-threaded   apartment   to   single-threaded   apartment   occurred.    
  Top

8 楼jifeng1123(几风)回复于 2004-12-05 10:25:27 得分 0

to   :hushuangyan74()你的方法好像不起作用!  
  我写一下我环境:  
        我现在调试的程序是客户端,它主要的功能是通过datagrid来显示我从dcom服务器上返回的一个recordset。所以我要用到下面的一些代码:  
  hr=   ::CoInitialize(NULL);  
      if(FAILED(hr))  
    {  
              MessageBox("coinitialize   failed!","waring",MB_ICONWARNING);  
              return   FALSE;  
    }  
     
        hr=CoInitializeSecurity(NULL,1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT,RPC_C_IMP_LEVEL_IDENTIFY,NULL,0,NULL);  
        if   (FAILED(hr))  
          {  
                  MessageBox("coinitializesecurity   failed!","waring",MB_ICONWARNING);  
                  return   FALSE;  
          }  
           
          COSERVERINFO   ServerInfo={0,L"FILESERVER",NULL,0};  
          MULTI_QI   MultiQi={&IID_IUnknown,NULL,NOERROR};  
   
          hr=CoCreateInstanceEx(CLSID_Search,NULL,CLSCTX_REMOTE_SERVER,&ServerInfo,1,&MultiQi);  
          if(FAILED(hr))  
          {  
                  MessageBox("CoCreateInstanceEx   failed!","waring",MB_ICONWARNING);  
                  return   FALSE;  
          }  
   
          pUnknown=(IUnknown*)MultiQi.pItf;  
          hr=pUnknown->QueryInterface(IID_ISearch,(void**)&psearch);  
          if   (FAILED(hr))  
          {  
                  MessageBox("QueryInterface   failed!","waring",MB_ICONWARNING);  
                  return   FALSE;  
          }  
          pUnknown->Release();  
   
  _RecordsetPtr   sptr(__uuidof(Recordset));  
  CString   m_sql;  
  m_sql="select   *   from   Customers";  
  psearch->SelectRecord(m_sql.AllocSysString(),(IUnknown**)&sptr);  
  如果不加datagrid我的程序能编译,也能运行。  
  但是加了datagrid后,我的程序在CoInitialize(NULL);返回1,继续运行在CoInitializeSecurity的地方出现0x80010119   在整理或打乱界面时必须初始化安全机制,一旦初始化,不能再做修改。  
   
  我起初以为是dcom配置问题,仔细查找后,加了datagrid才出现!我不知道是什么原因,恳求大家帮帮忙,我郁闷死了!  
  Top

9 楼newkey007(无限天空 www.xDrv.com)回复于 2004-12-05 11:39:37 得分 5

初始化ole   tryTop

10 楼jifeng1123(几风)回复于 2004-12-05 12:19:42 得分 0

我试过初始化,ole也不行Top

相关问题

  • 需要调用几次::CoInitialize(NULL)?
  • AfxOleInit();和::CoInitialize(NULL);用来初始化ADO环境有何区别?
  • this==NULL???
  • .用CoInitialize(NULL)初始化com库,和使用AfxOleInit()初始化com库有什么不一样??
  • to :nononono(null,null)
  • nononono(null,null)!!!!
  • javax.ejb.NoSuchObjectLocalException: null; CausedByException is:null
  • a==null 和 a is null
  • Test(NULL)
  • Update NULL

关键词

  • hr
  • 控件
  • datagrid
  • null
  • coinitialize
  • iconwarning
  • coinitializesecurity
  • multiqi
  • 返回
  • 初始化

得分解答快速导航

  • 帖主:jifeng1123
  • bobob
  • Semigod
  • IloveAzhu
  • newkey007

相关链接

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

广告也精彩

反馈

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