2009-07-22 13 views
0

こんにちは私のコードで間違っています私は次の方法でレジストリにクラスを登録しようとしていますが、私はそれがクラスが登録されていないとアプリケーションがクラッシュすることを示しているデバッグ中です。クラスをレジストリに登録するには?

このコードで何が間違っていますか教えてください。

Test::IDiscover *pICalc = NULL; 
HRESULT hRes=CoCreateInstance(Test::CLSID_SqlClass, NULL, 
    CLSCTX_INPROC_SERVER,Test::IID_IDiscover, reinterpret_cast<void**> (&pICalc)); 
if(hres<0) 
    cout<<"register failure"<<endl; 
else 
    cout<<"register success"<<endl; // and i am not free the memory any where... 

そして、私も同様に試してみました:私は

IDiscoverPtr pt__uuid(SqlClass)); 

でこれをデバッグするとき、私はこのように行う場合

IDiscoverPtr pt(__uuid(SqlClass)); 
HRESULT hRes=CoCreateInstance(Test::CLSID_SqlClass, NULL, 
    CLSCTX_INPROC_SERVER,Test::IID_IDiscover, reinterpret_cast<void**> (&pICalc)); 
if(hres<0) 
    cout<<"register failure"<<endl; 
else 
    cout<<"register success"<<endl; 

デバッグは、この機能へと進むと、内部COMエラーを示しています。

+1

HRESULTをテストするためのFAILEDとSUCCEEDEDマクロがあります。これは、0と比較する代わりにそれらを使用して、より読みやすいコードを与える必要があります。 – sharptooth

答えて

1

IDiscoverのインターフェイスはどこですか?このインターフェイスを実装した特定のDLL/EXEを登録する必要があります。あなたにヒントを与えるために、これはSqlClassという名前のクラスを持つDLLになります。それはおそらくCom DLLでしょう。コマンドラインでregsvr32を使用してそのDLLを登録します。以下のような

何か:

regsvr32 "MyDllFullPath.dll" 

をさらに知るためには、正確なエラーが何であるかは、hresの値が正確であることを教えて。私はそれがClass Not Registeredエラーに変換する数値であると推測しています。

+0

私はすでにRegAsm.exeを使用してそのDLLを登録し、tlbファイルを生成し、上記のコードを使用している場所からC++プログラムでそのtlbファイルをインポートします。 – Cute

+1

OK、ここで面白いものが増えています。 RegAsmを使用しています。これは、DLLが.NET DLLであることを意味します。はいの場合、クラスとインターフェースにComVisible(True)属性を適用しましたか? – Aamir

+0

@Cute:regasm.exeを呼び出すときに/ codebaseスイッチを使用しましたか? – sharptooth

1

SqlClassというCOMクラスのインスタンスを作成しようとしています。実際にそのCOMクラスを登録しようとしていません。 COMクラスを登録するには あなたのCOMクラスは、アウトプロセスサーバーであれば、あなたのCOMクラスが

sqlclass.exe/REGSERVERインプロセスサーバーである場合、あなたは

ます。regsvr32 SqlClass.dllを行う必要があります

COMスマートポインタを使用しているということは、SqlClassがDLLにあり、#importを使って参照していることを示しています。したがって、regsvr32 SqlClass.dllを使用します。

さらに、COM呼び出しのhresult戻り値を確認するために、マクロが成功または失敗したことを使用します。

0

regasm.exeを使用してDLLを既に登録していると言うので、oleview.exeを使用して登録が正しく行われたかどうかを確認します。左側のツリービューの "All Objects"ノードに移動し、SqlClassコンポーネントが存在するかどうかを確認します。

コードでCoInitialize(NULL)コールが表示されません。 CoCreateInstanceを呼び出す前にCoInitialize(NULL)を呼び出していますか?

また、COMエラーコードを指定できますか?

+0

CoCreateInstanceの前にCoInitialize(NULL)を呼び出しています。 – Cute

+0

COMエラーコードを指定してください。 – Modicom

0

COMに公開されている.NETアセンブリを登録するときは、regasm.exeツールを使用します。 /codebaseコマンドラインスイッチを忘れないようにすることが重要です。このスイッチを使用しない場合、regasmはレジストリにDLLの名前を格納します。絶対パスではなく、コンシューマ(アプリケーション)がCoCreateInstance()を呼び出そうとすると、COMはDLLが実際にどこにあるかを知ることができません。

関連する問題