AfxOleInit 和CoInitlize的区别
来源:互联网 发布:洛奇英雄传au优化 编辑:程序博客网 时间:2024/05/27 14:13
【整理】:Ackarlix
在vc6中编译一个MFC程序时其中有段代码在创建数据库连接报错。
其源码如下:
其中声明
_ConectPtr m_pConn,在函数中
HRESULT hr = m_pConn.CreateInstance(__uuidof(Connection)); //_T("ADODB.Connection"));
if(FAILED(hr))
{
return false;
}
后来在检查,发现需要调用AfxOleInit()初始化组件即可解决。而我在文件中是加入了::CoInitialize(),但是在实际运行中该函数并没有起到作用。
而在所宣言中,AfxOleInit包含了CoInitialize()。但是为啥AfxOleInit能解决数据连接的CreateInterface问题呢?观察
AfxOleInit的源码。
--------------------------------------------------------------------------------
BOOL AFXAPI AfxOleInit()
{
_AFX_THREAD_STATE* pState = AfxGetThreadState();
ASSERT(!pState->m_bNeedTerm); // calling it twice?
// Special case DLL context to assume that the calling app initializes OLE.
// For DLLs where this is not the case, those DLLs will need to initialize
// OLE for themselves via OleInitialize. This is done since MFC cannot provide
// automatic uninitialize for DLLs because it is not valid to shutdown OLE
// during a DLL_PROCESS_DETACH.
if (afxContextIsDLL)
{
pState->m_bNeedTerm = -1; // -1 is a special flag
return TRUE;
}
// first, initialize OLE
SCODE sc = ::OleInitialize(NULL); //该句子做初始化ole
if (FAILED(sc))
{
// warn about non-NULL success codes
TRACE1("Warning: OleInitialize returned scode = %s./n",
AfxGetFullScodeString(sc));
goto InitFailed;
}
// termination required when OleInitialize does not fail
pState->m_bNeedTerm = TRUE;
// hook idle time and exit time for required OLE cleanup
CWinThread* pThread; pThread = AfxGetThread();
pThread->m_lpfnOleTermOrFreeLib = AfxOleTermOrFreeLib;
// allocate and initialize default message filter
if (pThread->m_pMessageFilter == NULL)
{
pThread->m_pMessageFilter = new COleMessageFilter;
ASSERT(AfxOleGetMessageFilter() != NULL);
AfxOleGetMessageFilter()->Register();
}
return TRUE;
InitFailed:
AfxOleTerm();
return FALSE;
}
可见,AfxOleInit()是封装了OleInitialize()来初始化com组件;
查询网上资料说:OleInitialize内部调用了CoInitialize 。在OleInitialize比ConInitialize多了以下支持:
Clipboard
Drag and drop
Object linking and embedding (OLE)
In-place activation
如果你不需要这些附加功能,就用CoInitialize或CoInitializeEx。
但是在本人程序中调用CoInitialize不行而AfxOleInit可以,难道OleInitialize中创建的所附几个在ADO com控件上用到,但是在写了一个控制台上的ado程序,调用CoInitialize却是可行的。其中细节和玄妙打个标记,容以后在研究吧,偷懒了,如果发现CoInitalize不行就用AfxOleInit吧。
0-----
汗颜:因为在app的InitInstance中的粗心末尾加了一句::UnCoInitialize(),造成coinitalize错误。实际上2个函数都可以初始化ado组件。mark。
- AfxOleInit 和CoInitlize的区别
- AfxOleInit 和CoInitlize的区别
- AfxOleInit 和CoInitlize的区别
- AfxOleInit和OleInitialize的区别
- CoInitialize()和AfxOleInit()区别
- AfxOleInit()和::CoInitialize(NULL)区别
- AfxOleInit()和::CoInitialize(NULL)区别
- AfxOleInit()和::CoInitialize(NULL)区别
- AfxOleInit()和::CoInitialize(NULL)区别
- AfxOleInit()和::CoInitialize(NULL)区别
- AfxOleInit()和::CoInitialize(NULL)区别
- AfxOleInit()和::CoInitialize(NULL)区别
- AfxOleInit()和::CoInitialize(NULL)区别
- AfxOleInit()和::CoInitialize(NULL)区别
- AfxOleInit()和::CoInitialize(NULL)区别(转载)
- AfxOleInit()和::CoInitialize(NULL)区别(转载)
- OleInitialize、CoInitialize、CoInitializeEx和AfxOleInit()区别
- OleInitialize、CoInitialize、CoInitializeEx和AfxOleInit()区别
- 指定光标在页面输入框的位置
- “Teradata数据库技术概略”系列文章编写提纲
- 【调查】2008年12月,经济危机影响到你了吗?
- [精华] UNIX系统下部分控制代码介绍及其应用
- 为什么有人惧怕开源?--傻子的钱最好赚
- AfxOleInit 和CoInitlize的区别
- 国际:写出漂亮代码的七种方法----看了美化化码的想法,觉得很好,故加以引用,希望更多人可以看到
- Struct 结构体疑惑(c语言)
- 终验结果的经验
- Unix下如何直接获取键盘输入而不需要以回车作为结束符的方法总结
- 如何用C语言操纵AVR的IO端口(以ICCAVR为例)
- 总结Java中return语句的用法
- asp.net的自代验证forms
- windows CE应用程序异常的调试方法——转载