tlhファイルで構文エラー

[戻る]
たけ 2004/11/12(金) 13:56:02
たけです。いつもお世話になっています。

使用したいCOMファイル「xxx.dll」をプロジェクト直下に置き、

#import "xxx.dll" no_namespace named_guids raw_interfaces_only
と記述しコンパイルしたところ↓のエラーがいくつか出てしまいました。

c:\hogehoge\プロジェクト名\debug\xxx.tlh(77) : error C2059: 構文エラー : '__uuidof'

tlhファイルのエラーの箇所は↓のような記述です。
_COM_SMARTPTR_TYPEDEF(_XXXXX, __uuidof(_XXXXX));  (*)XXXXは、使用するクラス名

またCOMは、VB6.0で作成したものです。

使用するCOMは動作確認が出来ているものなので、COMファイルが
おかしいということはないはずです。

このエラーを解決するにはどうしたらよいでしょう?ご教授ください。

開発環境:VC6.0、MFC、Win2000

シャノン 2004/11/12(金) 15:45:46
uuidof って、使ったこと無いですけど、UUID を指定するものでしょうから、クラス名
じゃダメなんでは?

dairygoods 2004/11/12(金) 15:55:31
importの前に <comdef.h> をインクルードしてみるのはどうでしょう?

Ban 2004/11/12(金) 16:44:54
> uuidof って、使ったこと無いですけど、UUID を指定するものでしょうから、
> クラス名じゃダメなんでは?

CComPtr::CoCreateInstance の実装などに使われてて、
たとえばこんな感じで使うものです。(イメージ)

template <typename Q>
HRESULT QueryInterface(CComPtr<IUnknown>& unknown, Q** pp)
{
  return unknown->QueryInterface(__uuidof(Q), reinterpret_cast<void**>(pp));
}

インターフェイスクラスのポインタを渡せばそのGUIDが返りますが、
少なくともクラス名を入れるものではなく、試してみましたがやはり
コンパイルはできませんでした。

Ban 2004/11/12(金) 16:52:55
多分、tlh 内の上記箇所の実体が使用する _com_ptr_tが見つからないのだと
思いますので、対応としてはdairygoodsさんが指摘されている
#include <comdef.h>
が正解ではないでしょうか。

たけ 2004/11/12(金) 17:39:36
レスありがとうございます。

>uuidof って、使ったこと無いですけど、UUID を指定するものでしょうから、クラス名
>じゃダメなんでは?
私が↓のように書いたことに対するご発言ですよね。
(*)XXXXは、使用するクラス名
すいません。COMを作ったのが他人なもので
たぶんクラス名だろうと思って書きました。
だからクラス名ではないかもしれません。

また、tlhは自動生成されたものなのでtlhファイルにエラーが
出ていますが、tlhファイルはOKなはずです。

>importの前に <comdef.h> をインクルードしてみるのはどうでしょう?
↑をやってみたのですが現象は変わりませんでした。

たけ 2004/11/13(土) 10:39:24
[[解決]]
原因がわかりました。
プロジェクトの中に同名でComdef.hというファイルがあります。
このファイルは、最初プロジェクトフォルダの直下にあったのですが
ひとつ上のフォルダのhogeフォルダに移動させました。
そして、プロジェクトの設定で、インクルードさせるフォルダとして
「../hoge」と加えました。
これがよくなかったようです。 実はこれを行う前はちゃんと動いていました。

解決方法としては、もともとあったComdef.hの名前を変更するだけでOKでした。

皆様のご意見から解決できました。ありがとうございました。

古いスレッドには追加発言できません。