我在VC6.0中创建了一个工程,首先建了一个ADOConn类,使用ADO连接数据库时使用了CoInitialize(NULL),但在工程的另一个地方也使用了CoInitialize(NULL)==S_OK,结果出错,不知怎么回事,是不是在一个工程中不可以两次使用CoInitialize(NULL)?
通常不要两次初始化,两次一般也不会出问题,使用GetLastError看看错误码是啥,可以找到问题
如果是多线程,使用COM对象时,有时是必须初始化多次的
恩谢谢,函数不知怎么用的,是不是可以定义一个类,把CoInitialize(Null)封装成静态的,然后再调用,但怎么封装类呢
用GetLastError()显示句柄无效,什么原因呢,在readshortcut()函数中CoInitialize(Null)后测试的
如果你连续写七八个 CoInitialize(NULL),程序照样能运行,那你就不必纠结。
恩谢谢,函数不知怎么用的,是不是可以定义一个类,把CoInitialize(Null)封装成静态的,然后再调用,但怎么封装类呢
@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,或者直接把代码嵌入进去也行。
谢谢,有道理,但还是没懂,能更详细点吗,比如,我提到的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;
}
上面在一个函数中
结果路径读不出来
用SUCCESSED(CoInitialize(NULL))
已经初始化它返回的是S_FALSE也是成功
直接这样玩好了
// 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; }