CoInitialize 起了什么作用啊?

addition 2003-06-20 07:37:51
CoInitialize 与
CoUninitialize 的问题:
Before you create any objects, COM must be initialized by calling the CoInitialize function. If you are creating objects indirectly, the object creation method will handle this task. If you need to create an object with CoCreateInstance, you must call CoInitialize explicitly. When you are finished, COM must be uninitialized by calling CoUninitialize. If you make a call to CoInitialize you must match it with a call to CoUninitialize. Typically, applications that need to explicitly initialize COM do so in their startup routine, and they uninitialize COM in their cleanup routine.

我现在用了CoCreateInstanc,怎么不用这两个函数也可以呢?
还有,我记得我以前确实必须要用这两个函数才能运行我的程序,
但现在(过了半年了),很奇怪,注释掉这俩个函数也一样能运行
我自己都搞不懂为什么。
...全文
3149 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
brave_heart 2003-06-22
  • 打赏
  • 举报
回复
上一贴有笔误。

IRemoteTimePtr pTime(__uuidof(RemoteTime));

这一句里面就已经包含了CoCreateInstance的调用
brave_heart 2003-06-22
  • 打赏
  • 举报
回复
>> 这里哪一句是“其他COM函数“呢?

IRemoteTimePtr pTime(__uuidof(RemoteTime));

这一句里面就已经包含了CoCreateInstall的调用

>> 比如我这样写行不行呢?
//-----------------------------
CoInitialize(NULL);
call 其他COM函数1;
CoUninitialize();

CoInitialize(NULL);
call 其他COM函数2;
CoUninitialize();

当然可以,但是效率太低了。一般都是在线程开始时调用CoInitialize(NULL);线程结束时调用CoUninitialize();
addition 2003-06-20
  • 打赏
  • 举报
回复
前面没说请,重写一遍:
调用其他COM函数为什么必须要写这两句呢?
addition 2003-06-20
  • 打赏
  • 举报
回复
还有调用其他COM函数必须要写这俩句呢?
不要笑我懂得太少啊,我对com确实一点都不懂啊。
addition 2003-06-20
  • 打赏
  • 举报
回复
还是不大懂,
这里哪一句是“其他COM函数“呢?
这两句是不是只要写在其他COM函数调用的前后呢?
比如我这样写行不行呢?
//-----------------------------
CoInitialize(NULL);
call 其他COM函数1;
CoUninitialize();

CoInitialize(NULL);
call 其他COM函数2;
CoUninitialize();
//-----------------------------
这两个函数如果有一个不写会有什么后果?
brave_heart 2003-06-20
  • 打赏
  • 举报
回复
>>这两个到底什么时候需要用,应该写在什么地方呢?

这两个函数分别是在当前线程上初始化COM库和关闭COM库的。

CoInitialize应当在调用任何其他COM函数之前被调用,新程序应当用CoInitializeEx

CoUninitialize应当在COM应用结束后被调用

比如

#include "stdafx.h"

#import "..\TimeServer\TimeServer.tlb"
using namespace TIMESERVERLib;

int _tmain(int argc, TCHAR* argv[])
{
CoInitialize(NULL);

DATE date = 0;

{
IRemoteTimePtr pTime(__uuidof(RemoteTime));
date = pTime->GetTime();
}

SYSTEMTIME st = {0};
VariantTimeToSystemTime(date, &st);
_tprintf(_T("%04d-%02d-%02d %02d:%02d:%02d\n"),
st.wYear, st.wMonth, st.wDay,
st.wHour, st.wMinute, st.wSecond);

CoUninitialize();
return 0;
}
sevencat 2003-06-20
  • 打赏
  • 举报
回复
好像是线程模式,有一个可以有更多的选择的空间。
addition 2003-06-20
  • 打赏
  • 举报
回复
这两个到底什么时候需要用,应该写在什么地方呢?
zhourongbiao 2003-06-20
  • 打赏
  • 举报
回复
同意cppdebug(兰雪)
cppdebug 2003-06-20
  • 打赏
  • 举报
回复
好像是初始化com的

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧