2009-07-21 5 views
3

私は最近、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. 
+0

権限と関係がありますか?つまり、ユーザーがアクセスできるディレクトリにコントロールを置いて登録し、それが動作するかどうかを確認してください。 – shahkalpesh

+0

@shahkalpesh:私はあなたの提案を理解するか分からない。しかし、すべてがWindows XPにあり、管理者レベルのユーザーとして実行されていることはわかります。 –

答えて

2

私はそれが私のコントロールの3つの特定のメソッド(「refパラメーターを介して)返す」構造体と関係していることを発見しました。私は構造体の代わりにクラスを返すことを含む回避策を使用して終了しました。しかし、私はまだ興味があるので、私はdifferent questionに尋ねました。

0

は、フォームからユーザーコントロールを削除してくださいあなたのメインのVB6アプリで、それを再追加します。

+0

それは動作しませんでした。 –

0

わかりませんが、そのような問題もありました。/codebaseでregasmを使ってみてください。

+0

問題があったときにregasmを単独で使用していて、/ codebaseを使用して切り替えた場合、またはGACに/ codebaseを使用して切り替えた場合は、 –

+0

私はGACを使いませんでしたが、あなたはそれを使うことができます。実際には、GACを使用しない場合は警告が表示されますが、複数のバージョンのアセンブリを同じマシンにインストールしようとすると警告が問題になるだけです。これはもう一度COMでうまくいっていないものです –

+0

幸い、ただ1つのバージョンがあります。 GACへのインストールとregasm/codebase(msdnのregasmの参照に基づく)を使用する唯一の違いは、後者の場合、DLLをその場所に置いてその場所に置かなければならないことです。 –

関連する問題