2009-04-22 23 views
1

私はWindowsフォームにしたいC++コンソールアプリケーションを持っています。私は方法がわからないので、MFCを使用したくありません。代わりに、私はCOM dll(クラスライブラリ)を作成するためにC#を使用しています。アプリケーションとdllをターゲットコンピュータに配布するときに、アプリケーションがCOMインターフェイスを参照し、dllで作成したクラスを使用できるようにdllを登録する必要があります。私はこれを行うには、いくつかの方法があります知っているWinXPコンピュータにCOMアセンブリを静かに登録する方法

  1. は自分のアプリケーションのインストーラを使用します。regasmを持っている - 私はので、2つのうち、これを使用したくない:私は知りませんA.そのターゲットPC上の場所(どこかに存在していても、そのパスをハードコードしたくない)、B.インストーラでregasmを再配布することもできますが、マイクロソフトがこれを自由に許可するかどうかはわかりません。

  2. 私のアプリケーションのインストーラはgacutilを使っていますか?上記と同じです。

  3. 開発用コンピュータでregasmを使用して.regファイルを作成し、アプリケーションのインストーラで.regファイルを実行させる - これには2つの問題があります。A.アンインストール時にDLLの登録を解除することはできません。 B.regを実行するとregeditが呼び出され、ユーザーにレジストリに情報を追加するかどうかを確認するかどうかを尋ねるメッセージが表示されます。これはサイレントな「はい」にして、ユーザーに決定させません。 regeditには/ silent引数がありませんので、私はこれを使用することをあきらめました。

  4. Innoセットアップインストーラを使用し、COMライブラリの.tlbファイル(regtypelibフラグ)を登録しようとしましたが、登録は機能しますが、アプリケーションは引き続きクラスのインスタンスを作成できません。

  5. ClickOnceを使用してアプリケーションをデプロイします。これはオプションです。アプリケーションをディスクの特定のフォルダに置いて、ユーザーのDocuments and Settingsフォルダの下に置かないでください。

私は、C++とC#Visual Studio 9.0のExpressエディションを使用していることに言及しておきます。 Windows XPコンピュータにCOMライブラリを登録する他の方法はありますか?

編集 - アップデート

私はここhttp://msdn.microsoft.com/en-us/library/ms973915.aspxからの例から自分自身を導く登録フリーCOMを試してみました。私がマニフェストに持っていた問題を除いて、私は最終的にCOM dll(登録無料)を "見る"ようにアプリケーションを得ました。マニフェストは現在機能しています。 残念ながら、CoCreateInstance()を呼び出すと、E_OUTOFMEMORY(0x8007000E)が返されるようになりました。 COM dllには2つのクラスがありますが、1つのみCOM-visibleインターフェイスを作成します(もう1つはFormのクラスで、私はそれをプライベートにします)。これが問題だろうか? ここにいくつかのコードがあります:

#import "MyGUI_DLL.tlb" raw_interfaces_only named_guids 
[…] 
static MyGUI_DLL::MyGUI * g = NULL; 
r = CoInitializeEx(NULL, COINIT_MULTITHREADED); 
// r is S_OK here 
r = CoCreateInstance(MyGUI_DLL::CLSID_MyGUIClass, NULL, CLSCTX_INPROC_SERVER, MyGUI_DLL::IID_MyGUI, reinterpret_cast<void**>(&g)); 
// r returns E_OUTOFMEMORY 

ありがとうございました。

+0

あなたは、実行時に.NETのインストールパスを検出するためのGetCORSystemDirectoryを()を使用することができます:ここでそれに良い記事があります。 regasmとgacutilは常に.NETインストールと同じ相対位置を持ちます。 – sharptooth

+0

コードサンプルについては、この回答を参照してください。http://stackoverflow.com/questions/741632/is-there-a-tool-out-there-to-find-out-which-net-framework-is-installed-on- a-pc/741732#741732 – sharptooth

答えて

0

登録不要のcomを代わりに使用する必要があります。これはあなたが言及したすべての問題を回避しますが、もし排他的に使用されるならば、あなたのプログラムがwinxp以前のマシンで動作しないようにします。

0

interopアセンブリを処理するシナリオでは、COMコンポーネントを正しくインストールする必要があるということを無視しています。

これをコードで実行する場合は、P/InvokeレイヤーからLoadTypeLib API関数を呼び出す必要があります。

しかし、私は最良のソリューションは登録不要のCOMだと思っています。

http://msdn.microsoft.com/en-us/magazine/cc188708.aspx

関連する問題