私は最近、VB6アプリケーションで使用する.NET(Visual Studio 2008、プロジェクトターゲット.NET 2.0)でinteropユーザーコントロールを開発しました。アセンブリは、1つのコントロール、1つのクラス、およびいくつかの列挙型と構造体を公開します。私はInterop Forms Toolkit 2.0プロジェクトテンプレートfound hereのC#翻訳を使用してそれを開発しました。アセンブリは厳密な名前を持っており、GACにインストールされており、以下のスクリプトを使用してます。regasmに登録します:私のマシンでコンパイルした場合にのみ、.NET interopでVB6アプリケーションをコンパイルします。
@"C:\gacutil.exe" /i "C:\Program Files\AppName\Control.dll" /f
@"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm.exe" "C:\Program Files\AppName\Control.dll" /tlb:"C:\Program Files\AppName\Control.tlb"
問題:私は私のマシン上でVB6アプリをコンパイルすると、それは任意の上でうまく動作します他のマシン(もちろんコントロールがインストールされています)。しかし、アプリが別のマシンでコンパイルされると、そのマシンでは実行されますが、他のマシンでは実行されません。私はそれが実行されないと言うとき、私はあなたがそれを実行しようとし、絶対に何も起こらないことを意味します。
OleViewを使用して、自分のマシンと他のマシンの両方のコントロールを調べました。すべてのGUIDはタイプ情報と同じです。唯一の違いは、importlib( "stdole2.tlb")とimportlib( "STDOLE2.TLB")があることです。
私のマシンには、Visual Studio 6.0 sp6、VB6 interopユーザーコントロールテンプレート、Windows SDK 6.0および6.0A、Visual Studio 2008 sp1があります。このマシンは動作するマシンです。
同僚マシン:のVisual Studio 6.0 SP6、Visual Studio 2005の
別のマシン:2008 2008のVisual Studio 6.0 SP6、Visual Studioのは、今朝、この上にインストールして、問題を修正しませんでした。
どのようにVB6アプリケーションをコンパイルして、コンパイルされたマシン以外のマシンでも実行できるようにするにはどうすればよいですか?
(コメントでより多くの情報の要求を入れて、私は答えを提供するために、これを編集します。)
編集:
を提案はコントロールの登録に関連する権限について行われました。私はコントロールがうまくいくように見えることを明確にしたいと思います。私はそれを動作させるマシンとそうでないマシンに全く同じ方法で登録します。この問題は、コントロールを参照するVB6アプリケーションが自分以外のマシンでコンパイルされたときに現れます。
また、私は1つのフォームとinteropコントロールとカップルボタンを持っている小さなVB6ホストアプリケーションを持っていたと付け加えるべきです。これはメインのVB6アプリと同じ問題を呈しません。
おそらく手掛かり
誰もがOleview.exeはを使用して精通している場合は、私は手がかりを発見したかもしれないと思います。タイプライブラリリストを見ると、 "OrderControl(Ver 0.1)"と "OrderControlCtl(Ver 0.1)"があります。最初のアセンブリは、アセンブリに対して定義されたGUIDを使用し、パスはRegAsm.exeを使用して生成されたOrderControl.tlbを示します。 2番目のマシンでは異なるGUIDがあり、パスは「C:¥Program Files¥Microsoft Visual Studio¥VB98¥vbc00305.oca」で、他のマシンのパスは「C:\ Program Files \ Microsoft Visual Studio \ VB98 \ mscoree.oca "であり、同僚のマシンでは" C:\ windows \ system32 \ mscoree.oca "です。どちらのmscoree.ocaも同じサイズですが、マシン上のvbc00305.ocaは数KB小さくなります。
VB6プロジェクトの参考文献をもう一度見てみましょう。参照はOrderControlとOrderControlCtlの両方をリストしますが、OrderControlCtlだけがチェックされています。 OrderControlの位置はTLBファイルですが、OrderControlCtlの位置は各ステーションで異なるOCAファイルです。
依存関係ウォーカー
私は私のマシンと(私の上で実行されません)当社のビルドマシン上でコンパイル1上でコンパイルexeファイルのバージョンのためのDW内のプロファイルを実行しました。次の2行で分岐します。どちらも、最初の行を持っていますが、すぐに実行しないものは、ここで最初の行の後に取り外し始まるながら走る一つは、より多くのコール/負荷での続く:
GetProcAddress(0x7E720000 [SXS.DLL], "SxsOleAut32RedirectTypeLibrary") called from "OLEAUT32.DLL" at address 0x7712A637 and returned 0x7E746129.
GetProcAddress(0x7E720000 [SXS.DLL], "SxsOleAut32MapConfiguredClsidToReferenceClsid") called from "OLEAUT32.DLL" at address 0x7712A637 and returned 0x7E745C0D.
権限と関係がありますか?つまり、ユーザーがアクセスできるディレクトリにコントロールを置いて登録し、それが動作するかどうかを確認してください。 – shahkalpesh
@shahkalpesh:私はあなたの提案を理解するか分からない。しかし、すべてがWindows XPにあり、管理者レベルのユーザーとして実行されていることはわかります。 –