2012-03-07 10 views
2

私は、エージングOCXコントロールの使用に依存する.NETアプリケーションの開発中です。このコントロールは、航空会社の予約システムへのユーザーの対話を可能にする端末インターフェースを提供します。すでにいくつかのVB6アプリケーションで「成功」していますが、今後は.NETアプリケーションで使用する必要があります。エージング32ビットOCXコントロールが.NETで読み込めません。

.NET 4とVisual Studio 2010を使用しているWindows XP(x86)ボックスでは、正しく登録されたコントロールを使用するWinformsとWPFアプリケーションの両方を作成しました。私はReg Free COMを実装しており、XCOPYとClick-Onceの両方を使用することで、両方のプロジェクトをWindows XP(x86)マシンに正しくデプロイすることができ、両方を期待通りに動作させることができます。残念ながら、Vista(x86)とWindows 7(x64)のデプロイメントでは、アプリケーションは起動しますが、コントロールはレンダリングされません。

問題を理解するために、Windows 7(x64)開発環境にコントロールを登録しようとしました。私は両方を試してみました:

  • はます。regsvr32(x86のレジストリ)のSYSWOW64バージョンを使用してSYSWOW64ディレクトリに置か制御登録正常ます。regsvr32(x64のレジストリ)
  • を使用してコントロールを登録

でどちらの場合でもコントロールが正常に登録されたように見え、新しいWinformsプロジェクトではコントロールをツールボックスに追加できます(アイコンが表示されます)。しかし、フォームにコントロールをドラッグするとすぐに、XPのようにターミナルウィンドウではなく、フォームの角に小さなボックスとして表示されますが、XPと同じ方法でInteropファイルが生成されますか?

私は解決策のいずれかの種類のためのネットをトロール年齢を費やしている

Control in Windows 7

を選択したときにWindows 7に見られるように、XP

Control in XP

に見られるよう

コントロール制御や同様の問題は役に立たない。どんな提案も歓迎!

アップデート1:

@DanielHilgarthによって示唆されるように、私はコントロールを使用してVB6で基本的なアプリケーションを作成し、Windows 7(x64)の上でそれを実行しているとうるさく、それは登録COMコンポーネントと作品をピックアップ.NETアプリケーションまたはプロジェクトを横並びに実行することはできますが、コントロールは見えません。

アップデート2

私は基本的なWinformsのコントロールを使用して、私のXPボックスのアプリ(しかし自由をregない、すなわち登録する制御を必要とする)を作成した場合。 Windows 7(x64)マシンでこれを実行すると、コントロールを登録せずに(期待どおり)起動できなくなります。コントロールがx86/x64レジストリに登録されているかどうかは、どちらの方法でも開始されますが、コントロールは見られません。

アップデート3

私は(予想通り)コントロールが登録されていない限り、フォームデザイナが失敗するというのが私のWindows 7環境で私が実行した場合のWinFormsプロジェクト(XPおよびCOMで作成された無料REG)ことに気づきました再度どのレジストリが登録されているかは気にしていないようです。登録したら、設計者は、(制御なしで)見られるとビルド時に次の警告が見られる形式:

Windows 7 warnings

は、この警告を研究するが無駄となっている、Visual Studioが間違って見ていることを示していると思われますレジストリのパスが、私はこれを解決する方法を見つけることができません?

+0

Win7マシンのOCXコントロールでVB6アプリケーションを正常に使用できますか?ところで、画像をimageshackやそれに類するホスティングプロバイダにアップロードして質問にリンクさせることができます。 –

+0

例外を生成する登録問題のようには聞こえません。 VB6コントロールのように聞こえますが、.NETフォームではホストできません。すべてのシナリオがサポートされているわけではありませんが、適切に動作するActiveXコントロールでなければなりません。ウィンドウなし、自分のトップレベルウィンドウなどを作成することはできません。そのコントロールの所有者と協力して進んでください。 –

+0

@DanielHilgarth、それは非常に良い質問です。以前の開発者のVB6アプリケーションは非常に貧弱で、それらをインストールする 'カスタム'が必要だったので、私はこのルートを前に行っていませんでした!しかし、私はそれを行こう! – snipey

答えて

1

DEP(Data Execution Prevention)に問題があるようです。私は、OCXは許可されていないものをやっていると仮定します!

さまざまなテスト用のWindowsアプリケーションを実行しているときなどに例外がないことや、コントロールを登録するときに何か問題があったことはまだありません。

状況を修正するために、このblogに従ってポストビルドを編集しました。これで、コントロールをデバッグして見ることができるようになり、ClickOnce経由で公開されると、コントロールはすべてのOS、つまりXP/Vista/Windows 7に表示されます。

残念ながら、設計時にはコントロールはまだ見えません。それと!

1

私はあなたの質問に答えを出すことはできないと思っていますが、おそらく私はあなたにトラブルシューティングのためのアイディアを与えることができます。

私はちょうど推測していますが、あなたの問題の原因は、64ビットWindowsでの32ビット登録の問題か、おそらくUACを使用しているためアクセス権の問題です。最後の部分のトラブルシューティングを行うには、UACをオフにして、それが役立つかどうかを確認します。 64ビットのWindows

32ビットCOMは私が32 64対ビットの周りの混乱のビットを感知します。 64ビットのWindwosには1つのレジストリしかありません。ただし、COMコンポーネントは32ビットまたは64ビットです。これは、64ビットレジストリに32ビット登録のための別の領域が必要であるため、同じ登録が2つの異なる実装(Wow6432Node)を持つことができることを意味します。

重要な部分は、を知らないうちに、32ビットプロセスがレジストリの変更されたバージョンを見るということです。 COMコンポーネントがCLSIDを登録すると、HKCR\Wow6432Node\CLSIDにマップされていることを知らないで、HKCR\CLSIDというパスが使用されます。一方、64ビットRegeditを使って32ビットの登録を調べるには、そこを見る必要があります。ただし、レジストリが32ビットプロセスとして表示されるので、%systemroot%\syswow64\regedit.exeの32ビットRegeditを使用して、64ビットで32ビット登録の問題をトラブルシューティングする方が簡単です。

使用するコントロールは、ネイティブの32ビットコントロールであり、64ビットプロセスで読み込まれたり実行されたりしません。あなたは "あなたは通常のregsvr32(x64レジストリ)を使ってコントロールを登録しています"と書いていますが、これは不可能です。コントロールとそのすべての依存関係が32ビットの観点から正しく登録されていることを確認する必要があります。レジストリを64ビットの観点から見ると、Windowsが32ビットのレジストリをどのように再マップするかを理解する必要があります(または32ビットRegeditに切り替えるだけです)。

あなたは明らか登録無料のCOMを使用したいが、あなたはおそらく、あなたは「古い学校」の登録を使用して、あなたの問題を解決できるかどうかを確認しようとする必要があることを試みる前に。

登録 - 無料COM

私は記事Registration-Free Activation of COM Components: A Walkthroughに困っセクションを読んで推薦:

登録フリーCOMの問題のトラブルシューティング、イベントビューア[...]あなたの友人です

+0

マーティン、お時間をいただきありがとうございます!
32/64ビットレジストリの混乱について正しい方法ですが、主にこの問題を調査しようとすることに由来しています。多くの場合、人々はSysWow64ディレクトリにあるregsvr32.exeを使用する必要があると提案しました。私は、regsvr32.exeの両方のバージョンを使用していることを投稿してみました。どちらも正常に動作していますが、何も問題はありませんが、まだ何も問題ありません!... – snipey

+0

...私はWow6432Nodeについての理解を確認しましたが、Visual Studioで見られる警告についてはまだ混乱しています。コンポーネントを登録することができます。 'HKCR \ Wow6432Node \ CLSID'の下の' x64 'regeditのエントリを見つけ、' 32bit 'regeditで見たときに 'HKCR \ CLSID'の直下にあるが、Visual Studioはこれを見ることができません... – snipey

+0

。私は最初に登録方法を使用し、様々なことをテストしていたことに同意しました。私が気づいた奇妙なことの1つは、コンポーネントの登録を解除し、クラスIDがレジストリに残っていないことを確認できることです。しかし、コンポーネントDLLが 'Windows \ SysWow64'ディレクトリにある限り、(コンポーネントが登録されたXPマシンで作成された)VB6テストアプリは動作しますか? – snipey

関連する問題