検索のクラスの工場のためのコンポーネントのCLSID{XXXX}失敗により以下のようなエラー:80040154
-
10-07-2019 - |
質問
私が開発したWindowsのサービスを利用C#.NET 生PDFを報告する。をPDFファイルを使用している第三者dll.のアプリケーションが実行っWindows XPます。私が展開され、サービス Windows Server2008年 64ビット版、私はこのエラー:
検索のクラス工場 コンポーネントのCLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6} 失敗により以下のようなエラー:80040154.
の登録を行ったのは、DLLを使用regsvr32コマンドです。私は見ることができるこのCLSIDのレジストリ。が、問題が根強い。
何が問題なのでしょうか。
解決
VS-プロジェクトプロパティ-[ビルド]タブ-プラットフォームターゲット= X86
他のヒント
「Any CPU」に対してサービスが構築されたため、COMコンポーネントを使用している64ビットでエラーが発生したようです。 x86
のためにビルドする必要があります。
Webサイトはおそらく32ビットプロセスとして実行されているため、コンポーネントを使用できます。 <=>に対してソリューションを構築すると、サービスが32ビットとして実行されます。
よく似た問題に遭遇しました。
64ビットマシンで開発されていたWebアプリケーション内で古い32ビットDLLを使用する必要がありました。そのフォルダーのregsrv32のバージョンを使用して、32ビットDLLをwindows \ sysWOW64フォルダーに登録しました。
サードパーティDLLへの呼び出しはVisual Studioの単体テストからは機能しましたが、同じマシン上のIISでホストされているWebアプリケーションからは80040154エラーで失敗しました。
アプリケーションプールの<!> quot; 32ビットアプリケーションの有効化<!> quot;問題を解決しました。
プロジェクトプロパティプラットフォームターゲットX86を設定する必要はありません。 そのようなx86で動作するようにiisオプションを構成することもできます
- アプリケーションプールの選択
- アプリが使用するプールを選択します
- 詳細設定
- 32ビットアプリケーションを有効にする true
Any CPUアプリケーションを再コンパイルせずにこの作業を行う方法を探している場合は、別の潜在的な回避策があります:
- HKey_Classes_Root \ Wow6432Node \ CLSID \ {GUID}の下でCOMオブジェクトGUIDを見つけます
- 見つかったら、新しいREG_SZ(文字列)値を追加します。名前はAppIDで、データは検索したCOMオブジェクトGUIDと同じでなければなりません
- HKey_Classes_Root \ Wow6432Node \ AppIDの下に新しいキーを追加します。新しいキーは、COMオブジェクトGUIDと同じ名前で呼び出す必要があります。
- 追加した新しいキーの下で、新しい文字列値を追加し、DllSurrogateと呼びます。値を空のままにします。
- HKey_Local_Machine \ Software \ Classes \ AppID \の下に新しいキーを作成します ここでも、新しいキーはCOMオブジェクト<!>#8217;のGUIDと同じ名前で呼び出す必要があります。このキーの下に値を追加する必要はありません。
このソリューションは信用できませんが、うまくいきました。詳細およびその他のコメントについては、ソースリンクを確認してください。
問題は、サーバープロセスが64ビットで、ライブラリが32ビットであり、同じプロセス(インプロセスサーバー)でCOMコンポーネントを作成しようとすることです。サーバーを再コンパイルして32ビットにするか、サーバーを変更せずにCOMコンポーネントをアウトプロセスにします。 COMサーバーをアウトプロセスにする最も簡単な方法は、COM +アプリケーションを作成することです-コントロールパネル-<!> gt;管理ツール-<!> gt; ComponentServices。
コンパイル設定を変更しませんでした。
Just set <!> quot; Enable 32-bit Application = True <!> quot; AppPoolの詳細設定で。
それは私のために働いた
Windows 2008サーバーx64のソリューションは次のとおりです。
- 管理者権限でcmd.exeを開きます。
- dllをフォルダーC:\ Windows \ SysWOW64にコピーします
- C:\ Windows \ SysWOW64からregsvr32を実行します
- dllがWindowsのレジストリにあることを確認します。
- dllを使用する.exe x86がある場合、exeはx86モードでコンパイルする必要があります。
- exeはC:\ Program Files(x86)フォルダーにインストールする必要があります
この手順は有効で、問題ありません。
異なるが同様の修正を伴う関連問題がありました:
<!> quot; Any-CPU <!> quot;に設定されたWindowsサービスプロジェクトがありました。 64ビットDLLを使用します。同じエラーメッセージ。たくさんのことを試しましたが、何もうまくいきませんでした。最後に、プロジェクトのプロパティ-<!> gt;に入りました。ビルドして、プロジェクトに<!> quot; Prefer 32-bit <!> quot;があることに気付きました。チェック。これをオフにすると、エラーはなくなりました。
私の推測では、Windowsサービスは32ビットDLLを予期していたので、見つかりませんでした。
同じ問題が発生しましたが、他の回答ではソリューションの一部しか提供されていませんでした。
解決策は2つあります:
Registeryから64ビットを削除します。
- c:\ windows \ system32 \ regsvr32.exe / U
- これは、他のフォルダーにある他のコピーされたdllへの参照を削除しません。
または
- HKEY_CLASSES_ROOT \ CLSID {......} \ InprocServer32というキーを見つけます。このキーには、デフォルト値としてDLLのファイル名が含まれます。
- HKEY_CLASSES_ROOT \ CLSID {......}フォルダーを削除しました。
32ビットとして登録:
-
C:\Windows\SysWOW64\regsvr32 <file.dll>
64ビット登録を削除せずに32ビットとして登録しても問題は解決しません。
変更x86:
- をセットアッププロジェクトのためのソリューション.
- 後に創造していくかについては、ソリューションエクスプローラを右クリックして設定。
- プレス設定マネージャ。
- をクリック:"アクティブミッションステートメント"コンボボックスを選択し新がない場合、x86表示)
- から選択最初のコンボx86してOKを押してください。
- 再構築プロジェクトの設定、その全てを再構築します。
Webサイトを実行している場合は、アプリケーションプールを設定して、32ビットアプリケーションを無効にすることもできます(プールの詳細設定の下)。
VSTOを使用している人にとって、問題はoffice
アセンブリへの参照の欠落でした。特定のVSTOオブジェクトを手動でインスタンス化しようとした場合にも表示されます。
個人的なケースでは、開発者マシンのWindowsレジストリでクラスIDを検索することで問題が修正されました(クライアントPCで問題がスローされたため)。このアクションは、問題を引き起こすCOMコンポーネントに配置されます。インストーラーまたはアップデーターアプリケーションの OCX / COMとして登録されていなかった.NETプロジェクトで参照されているx86ライブラリ。
よろしく
私の問題は、プロジェクトReferencesに間違ったMS Sync FrameWorkバージョン(1.0)があったことです。バージョン2.1への更新後、エラーはなくなり、生活は再び良くなりました。
問題がDLLの実際の登録に関連していることがわかりました。
最初の実行<!> quot; Regedit.exe <!> quot; CMDプロンプトから(セキュリティレベルを管理者に上げました、<!> quot;念のため<!> quot;)、レジストリを検索します(<!> quot; Edit / Find <!> quot; RegEditメニューまたはCtrl + Fを押して) COMクラスファクトリに関して受け取ったエラーメッセージに表示されるCLSIDについて。私のCLSIDは29AB7A12-B531-450E-8F7A-EA94C2F3C05Fでした。このキーが見つかると、 サブキー<!> quot; InProcServer2 <!> quot;を選択します。そのHiveノードの下で、右側のRegeditフレームで問題のDLLのファイル名を確認します。 <!> quot; Default <!> quot;の下に表示。 そのファイルが<!> quot; C:\ Windows \ SysWow64 <!> quot;(C:\ Windows \ SysWow64 \ Redemption.dll <!> quot;など)にある場合 その後、<!> quot; C:\ Windows \ SysWow64 \ RegSvr32.exe <!> quot;を使用することが重要です。デフォルトの<!> quot; C:\ Windows \ System32 \ RegSvr32.exe <!> quotではなく、コマンドラインからそのDLLを登録するファイル。ファイル。 だから私はCMDプロンプトを実行し(管理レベルの制御下で(このレベルが必要な場合にのみ))、コマンドラインに入力します(私のDLLの場合): C:\ Windows \ SysWow64 \ RegSvr32.exe c:\ Windows \ SysWow64 \ Redemption.dll を押してEnterキーを押します。 コマンドウィンドウを閉じます(<!> quot; Exit <!> quot;その後、コンピュータを再起動します(常に不意に)再起動を使用して(不意に)再起動を徹底的にシャットダウンします<!> quot; Shut Down <!> quot;およびPower-Upは、ドライバーおよびその他の値の保存されたキャッシュを再ロードします(これはエラーの可能性があります)。 将来DLLを登録するときは、必ずSysWow64 <!> quot; RegSvr32.exe <!> quot;を使用してください。 C:\ Windows \ SysWow64フォルダーに保存されているDLLおよびこの問題c(登録が正しくないことが原因である場合)が再び発生することはありません。
私の場合、 word
や excel
などのms officeファイルを作成しています。 Win + R
を実行してを実行しますdcomcnfg
、DCOM Configで、OFFICE関連の名前項目(名前に Excel
または Word
または Office
が含まれるなど)を選択し、 プロパティを開き、Identityタブを選択し、インタラクティブユーザーを選択します。
としてこの回答、
私のエラーメッセージは CLSID {000209FF-0000-0000-0000-C000-000000000046}
を示しているので、DCOM Configでこの特定のCLSIDを見つけようとする必要があります。同じ手順に従って interactive user
を設定すると、動作します。