2016-09-11 10 views
0

私はのコマンドをmsdia140.dllで使用しようとしています。#importコマンドを使用してIDiaDataSourceのインスタンスを作成する方法は?

はい、私はそこにすでにインターフェイスを持つヘッダーファイルがあることを知っていますが、スマートCOMポインタを使用したいので、#importコマンドを使用します。私が使用

インポートコマンドは次のとおりです。

#import "bin/msdia140.dll" \ 
    rename("virtual", "Virtual")\ 
    exclude(    \ 
     "IStream"   \ 
    , "ISequentialStream" \ 
    , "_LARGE_INTEGER"  \ 
    , "_ULARGE_INTEGER" \ 
    , "tagSTATSTG"   \ 
    , "_FILETIME"   \ 
    , "IEnumUnknown") 

名前の変更があるため、キーワードの競合のものであり、除外は、名前がすでに存在しているタイプのインポートの警告を取り除くためにあります。

...App::InitInstance()の機能では、私はCoInitialize(NULL);と電話し、...App::ExitInstance()にはCoUninitialize();があります。しかし、成功せず、指示hereで述べたように

CComPtr<IDiaDataSource> pSource; 
CoCreateInstance(CLSID_DiaSource, 
        NULL, 
        CLSCTX_INPROC_SERVER, 
        __uuidof(IDiaDataSource), 
        (void **) &pSource); 

今、私はに相当するものをやろうとしています。私が試したコマンドは、

Dia2Lib::IDiaDataSourcePtr dataSource; 
dataSource.CreateInstance(__uuidof(Dia2Lib::IDiaDataSource)); 

ですが、スマートポインタはNULLのままです。私は間違って何をしていますか?

答えて

0

CreateInstance()の戻り値を見てください。それはあなたに問題、または少なくとも最初の問題を教えてくれるでしょう。私はバット見送り

一つの問題はこれです:

Dia2Lib::IDiaDataSourcePtr dataSource; 
dataSource.CreateInstance(__uuidof(Dia2Lib::IDiaDataSource)); 

それは次のようになります。

Dia2Lib::IDiaDataSourcePtr dataSource; 
HRESULT hr = dataSource.CreateInstance(__uuidof(Dia2Lib::DiaSource)); 

代わりコクラスのCLSIDのインタフェースIDを使用している - いつもとなります問題。

+0

私は前に 'CLSID_ *'変数を使っていると考えましたが、 'CLSID_ *'変数は定義されていませんでした。 – Adrian

+0

さて、CLSIDを使用する必要があります。それはCLSID _ *と呼ばれていないかもしれません。ちょうどどちらがコクラスであるかを調べてください。次に、__uuidof(Dia2Lib :: DiaDataSource)などのようなものです。 DLLへのパスがある場合は、oleviewを使用して表示します。oleview c:\ path \ to \ msdia140.dll。そこから型ライブラリを見て、コクラスのオブジェクトを見つけることができます。 –

+0

grinsについては、私のコンピュータで検索し、msdia120.dllが見つかりました。コクラスは、DiaSource、DiaSourceAlt、およびDiaStackWalkerです。 __uuidof(Dia2Lib :: DiaSource)を使用するとおそらく動作します。 –

関連する問題