首页 新闻 会员 周边 捐助

VC中关于CoInitialize的问题

0
悬赏园豆:20 [已解决问题] 解决于 2012-12-06 10:28

          我在VC6.0中创建了一个工程,首先建了一个ADOConn类,使用ADO连接数据库时使用了CoInitialize(NULL),但在工程的另一个地方也使用了CoInitialize(NULL)==S_OK,结果出错,不知怎么回事,是不是在一个工程中不可以两次使用CoInitialize(NULL)?

C++
xshang的主页 xshang | 初学一级 | 园豆:106
提问于:2012-11-29 21:00
< >
分享
最佳答案
0

通常不要两次初始化,两次一般也不会出问题,使用GetLastError看看错误码是啥,可以找到问题

如果是多线程,使用COM对象时,有时是必须初始化多次的

收获园豆:10
2012 | 高人七级 |园豆:21445 | 2012-11-30 08:17

恩谢谢,函数不知怎么用的,是不是可以定义一个类,把CoInitialize(Null)封装成静态的,然后再调用,但怎么封装类呢

xshang | 园豆:106 (初学一级) | 2012-11-30 10:58

用GetLastError()显示句柄无效,什么原因呢,在readshortcut()函数中CoInitialize(Null)后测试的

xshang | 园豆:106 (初学一级) | 2012-11-30 20:52
其他回答(3)
0

如果你连续写七八个 CoInitialize(NULL),程序照样能运行,那你就不必纠结。

收获园豆:5
Launcher | 园豆:45050 (高人七级) | 2012-11-30 09:12

恩谢谢,函数不知怎么用的,是不是可以定义一个类,把CoInitialize(Null)封装成静态的,然后再调用,但怎么封装类呢

支持(0) 反对(0) xshang | 园豆:106 (初学一级) | 2012-11-30 10:58

@xshang: 基本来说,封装是没必要的,因为实际的使用是这样的:

_tWinMain()

{

::CoInitialize(NULL)

// 其它代码。

::CoUninitialize();
}

封装个类,顶多是这样:

class Bootstrapper

{

BOOL m_bComInitialized;

   Bootstrapper(){if(SUCCEEDED(::CoInitialize(NULL)) m_bComInitialized = TRUE;}

   ~Bootstrapper(){if(m_bComInitialized)::CoUninitialize();}
}

然后这样调用:

_tWinMain()

{

Bootstrapper strapper;

// 其它代码。
}

如果你要想让你的某个类也具有该能力,你可以继承 Bootstrapper,或者直接把代码嵌入进去也行。

支持(1) 反对(0) Launcher | 园豆:45050 (高人七级) | 2012-11-30 11:14

谢谢,有道理,但还是没懂,能更详细点吗,比如,我提到的ADO连接数据库问题?在另一个地方也使用了

ADO m_ado;

                            USES_CONVERSION;
      // MessageBox(file[k].fileroot);
                       LPWSTR  pointer=A2W(file[k].fileroot); 
                      ReadShortcut(pointer,szPath);//通过快捷方式获取路径
      // MessageBox(szPath);
                         m_listCtrl.SetItemText(nCount,2,szPath);
                      break;
         }

上面在一个函数中

支持(0) 反对(0) xshang | 园豆:106 (初学一级) | 2012-11-30 18:12

结果路径读不出来

支持(0) 反对(0) xshang | 园豆:106 (初学一级) | 2012-11-30 18:15
1

用SUCCESSED(CoInitialize(NULL))

已经初始化它返回的是S_FALSE也是成功

收获园豆:5
Greatest | 园豆:678 (小虾三级) | 2012-11-30 15:32
0

直接这样玩好了

// dllmain.cpp : 定义 DLL 应用程序的入口点。 #include "stdafx.h" #include <combaseapi.h>

BOOL APIENTRY DllMain( HMODULE hModule,                        DWORD  ul_reason_for_call,                        LPVOID lpReserved       ) {  switch (ul_reason_for_call)  {  case DLL_PROCESS_ATTACH:   break;  case DLL_THREAD_ATTACH:   CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);   break;  case DLL_THREAD_DETACH:   CoUninitialize();   break;  case DLL_PROCESS_DETACH:   break;  }  return TRUE; }

 

全才欧巴 | 园豆:202 (菜鸟二级) | 2016-06-24 11:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册