2009-07-06 20 views
0

Windows 7の64ビット版のITaskBarList3でCoCreateInstanceが失敗する理由はありますか?エラーコードは、クラスが登録されていない0x80040154です。ITaskBarList3の0x80040154でCoCreateInstanceが失敗する

呼び出しコード(VB6)である:

Public Const IID_ITaskbarList3 = "{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}" 
Public Const CLSID_TaskbarList3 = "{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}" 

'.... 

Dim IID As GUID_API 
Dim CLSID As GUID_API 

Dim iTaskBarVB3 As ShellLib.ITaskbarList3 

rc = CLSIDFromString(StrPtr(CLSID_TaskbarList3), CLSID) 
rc = IIDFromString(StrPtr(IID_ITaskbarList3), IID) 
rc = CoCreateInstance(CLSID, 0, CLSCTX_SERVER, IID, iTaskBarVB3) 

CLSIDFromStringとIIDFromStringから戻る両方0(成功)です。私はレジストリ内の文字列を見つけることができます。私のタスクバーは明らかにうまく動作しているので、インターフェイスは他のプロセスから呼び出すことができます。

ITaskBarList3は、mktyplib.exeを使用してコンパイルされたタイプライブラリで宣言されています。私はGUID値を二重チェックして、SDKのものと一致します。

ご協力いただければ幸いです。

+0

クラスIDがインターフェイスIDと同じであることはありません。おそらくそれはしばらくしてはうまくいくかもしれませんが、それらを異ならせるのが典型的です。 – sharptooth

+0

@sharptooth:私も同じように両者を見たことはありません。しかし、IMOでは、両方ともレジストリの異なるセクションを持ち、両方のルックアップが別々の場所にあるので、これはうまくいく可能性があります。それを言って、これはしないでください。しかし、なぜこれがうまくいかないのか不思議です。 – Aamir

+0

私はそれがうまくいくと思いますが、そのようなコードを見ることは非常に疑わしいです。 – sharptooth

答えて

0

ClassIDは問題ではありませんでした。これは1週間ほど前に正しく機能していたためです。私は以前に32ビットのWindows Vistaでコンパイルしていました。

私はシステムをWindows 7、64-bitにアップデートしました。この問題は、32/64-bit互換性の問題ではありません。 TaskBarはWow64からアクセスできます。私はインターフェイスを32ビットATL DLLからうまく呼び出すことができます。

もう少し調べましたが、64ビットウィンドウのactxprxy.dllの問題に関するWeb上の参照がいくつか見つかりました。これは、OLEビューアに従って、インターフェイスが存在するように見えるDLLです。

とにかく、いくつかの人々は、.regスクリプトとファイルの登録解除/再登録のさまざまな組み合わせに恵まれました。残念ながら、私はその人の一人ではありません。

私は自分自身を頭痛から守ることに決めました。ちょうどATLを使用して小さなDLLを書きました。私はそれを呼び出すVBコードを持っています。セットアップでうまく動作します...

もう一度お手伝いをしてください。

4

最も可能性の高い理由は、呼び出し元コードが32ビットであり、COMサーバーが64ビットであるため、インプロセスサーバーとしてロードできないことが考えられます。

可能な解決策は、COMサーバーをアウトプロセスサーバーとして強制的に作成するCOM +アプリケーションを作成することです。ただし、COMサーバーがActiveXコントロールを提供するためのものであれば、これは役に立ちません。

私はまた、クラスIDがインターフェイスIDと等しいことに驚いています - それらを異なるものにするのが一般的な方法です。あなたはそのインタフェースを実装するコンポーネントの開発者ではなく、消費者だけであるため、クラスIDをインタフェースIDに間違って配置した可能性が高いため、クライアントプログラムが動作しないのはこのためです。 ITaskBarList3インターフェースを実装しているクラスのクラスIDを見つけ、それをクラスIDとして使用する必要があります。

1

CLSID_TaskbarList3は存在しません!単にCLSID_TaskbarList = "{56FDF344-FD6D-11D0-958A-006097C9A090}"です。実際には、IID_TaskbarList3 IIDとは異なるGUIDを持っています。

COMでは、通常、1つ以上のインターフェイスを実装する1つのクラスがあります。一般に、すべてのインタフェースに対して新しいクラスは存在しません。

関連する問題