2009-04-05 12 views
5

は、私たちはC#のWinFormsのアプリケーションを実行するとき、次のエラーが表示さ、特にVistaのx64のマシンがあります。に「TaskDialogIndirect」という名前のエントリポイントを見つけることができませんDLL「COMCTL32」

System.EntryPointNotFoundException: Unable to find an entry point named 'TaskDialogIndirect' in DLL 'ComCtl32'.

これと同じコードの動作を他のVistaマシンでも問題ありません。何らかの理由で、この特定のVistaマシンは常にこの例外をスローします。

これをどのように修正できますか?

答えて

7

私はこれとNaughterのフリーXTaskDialog APIに問題がありました。エミュレーションを介してWindows XPマシンでフォールバックの仕組みを取得し、このダイアログの実装をはるかに便利にしました。 :)

私のケースでは、これはblog entryで説明したように、起動コンテキストの問題でした。

ここに引用し

または、ブログの記事は、いくつかの日にサイバースペースで失われた場合には(Visual Studioのに適用されます):

  1. 、[セキュリティ]タブで
  2. をソリューションエクスプローラでプロジェクトのプロパティを開きます。 ClickOnceのセキュリティ設定を有効にチェックし、
  3. 今、あなたは以下のコードを挿入し、</trustInfo >タグの下に
  4. 、それを開いて、あなたのソリューションのプロパティフォルダ内のファイルをapp.manifest登場見ることができます。
  5. ビルドしようとすると、エラーが発生する可能性があります。これを修正するには、[ClickOnceセキュリティ設定を有効にする]をオフにします。

ステップ4で挿入するコード:

<dependency> 
    <dependentAssembly> 
    <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" 
     version="6.0.0.0" processorArchitecture="*" 
     publicKeyToken="6595b64144ccf1df" language="*" /> 
    </dependentAssembly> 
</dependency> 
+0

ありがとう、私たちはこれを試してみましょう。 –

+0

私はdllライブラリプロジェクト(Excelプラグイン)で同じ問題を抱えています。ライブラリプロジェクトのVSスタジオにセキュリティタブはありませんか? –

+1

現在(VS 2012/2013)このソリューションは動作しません:(これは魅力のように動作します:http://support.microsoft.com/kb/830033 –

1

私は、動作中と動作していないVistaマシンでcomctl32.dllのバージョンを比較し、同じバージョンを報告してもチェックサムを比較することをお勧めします。チェックする

他のもの:

  • それは非作業機は、ビスタのプレリリース版を持っていることは可能ですか?
  • Vista以外のバージョンのcomctl32.dllがマシンにコピーされ、アプリケーションによってピックアップされている可能性はありますか?
  • comctl32.dllの代わりにウイルスやワーム(あるいはそれ以外)が存在する可能性はありますか?Visual Studioに付属しているDependsユーティリティは役に立ちます。

アクティブ化コンテキストでこのarticleを読む価値があるかもしれません。

+0

おかげで、私たちはこれを見て必要があります。それが私たちの答えにつながるなら、あなたの答えを正しいものとして受け入れるでしょう。 –

1

プログラムの実行に使用した他のマシンでVista x86が使用されていた場合は、問題の原因となっているコードにPInvokeがある可能性があります。 コンパイラのターゲットアーキテクチャをx86に設定して、プログラムを強制的にx64 VistaのWoW64で実行したい場合があります。 既定では、Visual Studioはアーキテクチャに依存しない方法でアセンブリを構築します。つまり、64ビットシステムで.NETプログラムを実行しようとすると、ネイティブx64バージョンのCLRによってホストされて実行されます。そのコンテキストで32ビットDLLをロードしようとすると失敗します。アプリをエミュレートされたx86モードで実行するように強制する代わりに、そのトリックを行うべきです。

+0

ありがとうございます。しかし、x64対応ではないコンポーネントを使用しているので、既にx86としてコンパイルするようにアプリを設定しています。 –

関連する問題