質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

18745閲覧

C++でのCoInitialize()とCoUninitialize()について

beginner101

総合スコア18

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/12/21 01:52

前提・実現したいこと

初心者ですが、comを使用しているプログラムを作成しています。
CoInitializeとCoUninitializeをこのように書いているのですが、
エラーやメモリリークなどは起こらないでしょうか。

該当のソースコード

pDispatch::pDispatch() { CoInitialize(NULL); } pDispatch::~pDispatch() { CoUninitialize(); }

補足情報(FW/ツールのバージョンなど)

Windows10/64bit
VisualStudio 2017

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

すでに解決済みになっていますが念のため。

結論から言いますと、、COM関連の処理がpDispatchクラスのインスタンス存続中に限定されるのであれば、まったく問題ありません。むしろ、後述の通りその方が都合がよい場合もあります。

CoInitialize関数は内部的に呼び出し回数をカウントしていて、呼び出した回数だけCoUninitialize関数を呼べばよいことになっています(すでにCoInitialize実行済みでさらに呼び出すとS_FALSEが返されますが、それは成功扱いです)。ですからコンストラクタでCoInitializeを呼び、デストラクタでCoUninitializeを呼ぶというのは、元々の想定通りの使い方だと言えます。

勘違いされている方もいらっしゃいますが、CoInitialize関数はスレッド毎に呼ぶ必要があります。したがって、プロセス開始時にCoInitializeを呼び出して終了時にCoUninitializeを呼び出すというコードを書いていると、マルチスレッドで失敗します(スレッドを使わなければそれでも問題ないですが)。

その点、「使うときにCoInitializeを呼んで用が済んだらCoUninitializeを呼ぶ」というコードを書いておくと、マルチスレッド対応もしやすいです。

投稿2018/12/21 07:59

catsforepaw

総合スコア5944

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

beginner101

2018/12/25 01:36

回答ありがとうございます。
guest

0

最近COM関係のコードを書いていないので、うろ覚えで申し訳ありませんが、確かプロセス開始時に1回CoInitializedを呼んでやれば、あとは終了時にCoUnInitializedを呼べばよかったように思います。

なので、インスタンス単位で呼ぶ必要はないと思います。

頼りない回答ですみません。

投稿2018/12/21 03:19

KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

beginner101

2018/12/21 04:10

回答ありがとうございます。
guest

0

ベストアンサー

こんにちは。

ちょっと危険な感じがします。
CoInitialize()は一回だけ呼び出すもののようですから、pDispatchクラスのインスタンスが複数存在する場合、問題が起きるように思います。
pDispatchをCoInitialize()/CoUninitialize()呼び出し専用のクラスとし、インスタンスを一度には1つだけ生成するのであれば問題ないと思います。

投稿2018/12/21 03:10

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

beginner101

2018/12/21 04:09

回答ありがとうございます。 さっそく呼出し専門にして、インスタンスも一つだけ生成するように修正します。 本当に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問