2

私はこのサイトのチュートリアルに従っています:

http://progtutorials.tripod.com/COM.htm

暫定的な証拠: Visual Studio 2010、Windows 7 64 ビット。

セクション 3 の例をコーディングしています (サーバー DLL の実装)。示されているとおりにコードを正確に入力しましたが、セクション 4.1 で概説されているコードの 12 行目でこのコードを実行すると、「クラスが登録されていません」という例外が発生します (チュートリアルでは DLL にアクセスする方法が示されています。 3.1 の文字に従った):

 hresult hr = CoGetClassObject(CLSID_Car, CLSCTX_SERVER, NULL, IID_IClassFactory, (void **) &pClassFactory);

実行してみました:

 regsvr32 xyz.dll 

xyz.dll は、DLL を登録するための DLL へのパスです。これにより、DLLRegisterServer を見つけようとしてエラーが発生しました:

ここに画像の説明を入力

私はすでに実行しました

 REGEDIT
 HKEY_CLASSES_ROOT\CarDLL.Car\CLSID = {d969084c-b758-43ea-a218-a48763167abd}
 HKEY_CLASSES_ROOT\CLSID\{d969084c-b758-43ea-a218-a48763167abd} = CarDLL.Car
 HKEY_CLASSES_ROOT\CLSID\{d969084c-b758-43ea-a218-a48763167abd}\InProcServer32 = C:\Users\wiocl2\Documents\Visual Studio 2010\Projects\CarDLL\debug\CarDLL.dll

必要なすべての GUID をレジストリに入れると仮定しました (GUID は私が生成したものです)。

クラスに関数を追加して登録できるようにする必要があると思いますが、これを行う方法とそれを理解する方法がわかりません。私は長い間 COM を使っていなかったので、ちょっと迷っています。誰かが私に正しい方向に押し込むことができれば、それは役に立ちます。

編集:そうそう、#include を移動しました // DEFINE_GUID の定義が含まれています

そうしないと、ビルド時に未解決の外部エラーが発生していました。

4

1 に答える 1

1

最も可能性の高い説明: COM オブジェクトを 32 ビット DLL としてビルドしていますが、登録は 64 ビット DLL として実行されています。

対処方法: 管理者特権のコマンド ウィンドウを開き、DLL の場所 (C:\Users\wiocl2\Documents\Visual Studio 2010\Projects\CarDLL\debug) に移動します。そこに来たら、次のように入力します。

c:\windows\sysWOW64\regedit <filename of .reg file whose contents are displayed above>

これにより、32 ビット バージョンの REGEDIT が実行され、ハイブの正しい部分にレジストリ エントリが作成されるようになります。これを確認するには、HKLM\Software\Classes\CLSID ではなく{d969084c-b758-43ea-a218-a48763167abd}、HKLM\Software\Wow6432Node\Classes\CLSIDのエントリを確認する必要があります。

DllRegisterServerは、COM サーバー DLL に実装できるメソッドであり、regsvr32現在 .REG アプローチを使用しているのと同じ操作を実行するために使用する場合に必要です。同じ警告が適用されます。32 ビット DLL の場合は、c:\windows\sysWOW64\regsvr32.exe.

はい!COM はまだほとんど健在です :) 少なくとも、VS 2012 では標準サポートがまだ残っています。

それが役立つことを願っています。

于 2013-05-10T19:28:48.133 に答える