MDIアプリケーションで外部のソフトウェアを起動する際の問題

このQ&Aのポイント
  • MDIアプリケーションを開発中に起動問題が発生しました。VisualBasic2008Expressで開発しており、別のMDIアプリケーションを開発中ですが、別のアプリケーションを起動する方法について問題があります。現在の方法では起動したいプログラムのアセンブリは格納できますが、実行ファイルのメインフォームのクラス名を指定するとエラーが発生します。
  • アセンブリを格納できるが、メインフォームのクラス名を指定するとエラーが発生するため、別の方法を探しています。何か勘違いをしている可能性があるか、別の方法を知っている方がいればアドバイスをいただきたいです。
  • MDIアプリケーションを開発中に、別のアプリケーションを起動する方法に問題があります。現在の方法ではプログラムのアセンブリは格納できますが、メインフォームのクラス名を指定するとエラーが発生します。別の方法を知っている方がいれば教えてください。
回答を見る
  • ベストアンサー

MDIアプリケーションで外部のソフトウェアを起動する際の問題

お世話になっております。 早速ですが、現在MDIアプリケーションを開発中に問題が生じてしまいましたので、質問させていただきます。 開発環境はVisualBasic2008Expressです。 同じくVB.netで開発したソフトウェアをApp(1)とします。 現在、App(2)というMDIアプリケーションを開発し、そのMDIChildとしてApp(1)を起動したいと思っています。 そこで以下のような方法を見つけました。 Dim ass As System.Reflection.Assembly ass = System.Reflection.Assembly.LoadFrom("起動したいプログラムのFullName") Dim childFrm As Form = ass.CreateInstance("起動したい実行ファイルのメインフォームのクラス名") childFrm.MdiParent = Me childFrm.Show() この方法で、assには起動したいプログラムのアセンブリが格納できているのですが、 Dim childFrm As Form = ass.CreateInstance("起動したい実行ファイルのメインフォームのクラス名") まで来たら、childFrmがnullとなってしまい、エラーが発生してしまいます。 もし、何か勘違いをして使っているようでしたら、いいアドバイスが頂けたらと思います。 また、上の方法以外のやり方を知っている方がいらっしゃいましたらご教授いただいと願います。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

Dim childFrm As Form = ass.CreateInstance("起動したい実行ファイルのメインフォームのクラス名") ここで、クラス名だけでなく名前空間から指定しますか? 試してみたところ、存在しないクラスを指定した場合にNothingが返されました。 VBはコードで名前空間「Namespace」を指定しなくても、プロジェクトのルート名前空間が効いています。ルート名前空間が「App1」、フォームのクラス名が「Form1」の場合 App1.Form1 が指定すべき値になります。 確認してみてください。

negi0810
質問者

お礼

なるほど! ご指摘いただいた方法で試してみたところ、問題なく解決することができました。 クラスだけでなくルート名前空間も指定しないといけないとは勉強になりました。 ありがとうございました

関連するQ&A

  • MDIアプリケーションの子ウィンドウとしてOfficeを起動する方法

    MDIアプリケーションを作成しているのですが、行き詰ってしまったので質問させていただきます。 開発環境はVB.net2008Expressを使用しています。 タイトルの通りなのですが、MDIの子ウィンドウとして既存のプログラムやソフトウェア(今回はOfficeのWordを起動しようとしています)を起動する方法を調べています。 Dim ass As System.Reflection.Assembly ass = System.Reflection.Assembly.LoadFrom("起動したいプログラムのFullName") Dim childFrm As Form = ass.CreateInstance("起動したい実行ファイルのメインフォームのクラス名") childFrm.MdiParent = Me childFrm.Show() という方法を見つけて試してみたのですが、"起動したい実行ファイルのメインフォームのクラス名"がわからずオブジェクト参照されませんでした。 知識不足でどういった検索ワードで検索したらいいかもわからない状態です。どうか皆さんのお知恵を拝借させていただけないでしょうか?

  • MDI アプリケーションで

     VBの、アプリケーションウィザードでMDIテキストエディタが作れますよね。  それをいじってMDIの勉強してるんですが、今はそこで終了時に編集していながらまだ保存していないフォームを探して、コモンダイアログを表示させて保存させようとしています。  しかし、どうすればいいのか分かりません。  はじめは、フォームのキャプションかどこかに編集した印でも付けて、Formsを使ってそれを判断させようとも思ったのですが、開発途中で子フォームがもう一つ出来てしまい、それとごちゃごちゃになってしまう可能性が出てきました。  何とか、テキスト編集用の子フォームのみを判断させたいのですが、上手く出来ないものでしょうか。  特定の子フォームの数や番号を特定できるコマンドとかってVBにあるんですかね。あれば出来そうなんですが……何か良い方法があればお教えください。 ------------------- 開発環境 VB6.0(SP5) WIN2000

  • ラベルのクリックイベントについて

    現在、MDIParent1フォームに、MDI子フォーム(Form1)を表示させています。 MDIParent1フォーム,MDI子フォーム(Form1)には、それぞれlabel1が配置されています。 やりたい事 MDIParent1フォーム上のlabel1をクリックしたとき MDI子フォーム(Form1)上のlabel1のリックイベント を発生させたい よろしくお願いします

  • 指定した名前のサブフォームがあれば開きたいです。

    指定した名前のサブフォームがあれば開きたいです。 現在、vb2005+XPで開発しております。 メインフォームからサブフォーム(予定数100個)を開くイベントで 指定した名前のフォームが あれば開く… なければ違うイベント… そんな感じの開発を行っておりました。 現在は以下のようなソースです。 Dim myPath As String = System.Reflection.Assembly.GetExecutingAssembly().Location Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile(myPath) Dim t As Type = asm.GetType("YoushikiPrint.ClsF_" & PrtNoABC) If t Is Nothing Then 'サブフォーム無の場合 Else 'サブフォーム有の場合 end if やっとの思いでサブフォームが1個完成し 今日…2個目を作り始めました。 ところが… asm.GetType("YoushikiPrint.ClsF_" & PrtNoABC) の所でエラーが出るようになってしまい 1個目のフォームも開かなくなりました。 助けて下さい。 是非ご教示宜しくお願い致します。

  • DLLをアセンブリとして読み込み、インスタンスを作成しないで中身を読み出したい。

    System.Reflection.(assembly).Loadfrom命令でDLLを読み込み、 メソッドを取り出したい?のですが、その際インスタンスを作成しないで取り出す方法を知りたいのです。 うまく説明できませんが方法はありませんか? 例プログラムは http://bbs.wankuma.com/index.cgi?mode=al2&namber=14226&KLOG=30の引用 ---- dllFile = Me.edModule_id.Text formName = dllFile & ".frm" & dllFile '読み込むアセンブリの変数定義 If Not IO.File.Exists(dllFile & ".dll") Then 'ファイルが存在しない Return End If assemblyObject = System.Reflection.[Assembly].LoadFrom(dllFile & ".dll") '読み込んだアセンブリからクラスの型を取得 myType = assemblyObject.GetType(formName) If myType Is Nothing Then Return End If 'クラスのインスタンスを作成 objectInstance = System.Activator.CreateInstance(myType) '作成したインスタンスをフォームオブジェクトへ型変換 form = CType(objectInstance, Form) form.Show() ----

  • .NETプログラムが初回起動が遅い

    「ABC.DLL」のFrm_AAAを動的にロードするのですが、 初回のみ遅いのです。 Dim asm As Reflection.Assembly Dim obj As Object asm = Reflection.Assembly.Load("ABC") obj = asm.CreateInstance("ABC.Frm_AAA")     ↑初回のみ遅く、5秒以上かかる。 普段は、一瞬ですむのに、原因が分からないので困ってます。 ngen.exeで事前にコンパイルをしてみましたが効果なしでした。 また、ページアドレスをそれぞれ別のアドレスにしても効果なしでした。

  • MDIで、子フォームのみWPF

    winformで作ったアプリケーションに、MDIの導入を考えています。と同時にWPFにも興味があるのですが、MDIで作られる子フォームのみWPFにすることは可能でしょうか? 親winform⇒子winformの場合 //Form4はwindowsform Form4 childform = new Form4(); childform.MdiParent = this; childform.Show(); このように書いています。 それを 親winform⇒子WPFで //UserControl1はユーザーコントロールWPF UserControl1 childform = new UserControl1(); childform.MdiParent = this; childform.Show(); このように書いてみたのですが、エラーで使えませんでした。 MdiParentとShowに赤い線が引かれ、 自動機能で MdiParentには public Form1 MdiParent { get; set; } Showには internal void Show(){ throw new NotImplementedException(); } が、作られましたが解決には至りませんでした。 環境はvisualstdio2013でC#です。 そもそも子formのみWPFは可能なのでしょうか? 可能であれば、方法を教えてください。

  • C++/CLIとMFC

    よろしくお願いします。 環境はVisual C++ 2005です。 ご存知の方がいらっしゃいましたらご教授ください。 一つのプロジェクトで作成した親Formに対して、 もう一つのプロジェクトで作成した子ウィンドウをプラグインさせ、MDIを作ろうとしているのですが [CLR]->[Windowsフォームアプリケーション]で作成したプロジェクトのFormに対して MFCで作成した子ウィンドウをプラグインさせることは可能なのでしょうか? C++/CLIでMDIを作る時は MDIの親となるFormのIsMdiContainerプロパティをtrueに設定し、 MDIの子となるFormのMdiParentプロパティをMDIの親Formの インスタンスに設定する必要があると思うのですが、 子の部分をMFCを使って作成した場合どのようにすれば 親子関係が作れるのかわからず質問させていただきました。 よろしくお願いします。

  • 子フォームから開いたフォームと親子関係を結びたい(VB2003)

    子フォームから開いたフォームと親子関係を結びたい(VB2003) VB.NET2003についての質問です。 formMain のクラスに以下のコードを書いて実行させると、form1がformMainの子フォームとして開きます 下記は、「form1」を「formMain」の子フォームとして開くコードです。 (formMainクラス内のコードです)   ------------------------------   Dim f As New form1   Me.IsMdiContainer=True   f.MdiParent=Me   f.Show   ------------------------------ form1には、form2を開くボタンが用意されています。 質問内容は、このform2を、formMainの子フォームとして開くにはどうすればよいか、ということです。 ためしに、form1クラスに以下のコードを書いて実行させたところ、 「formMainは型であるため、式として利用することができない」というエラーメッセージが出てしまいました。   ------------------------------   Dim f As New form2   f.MdiParent = formMain   f.Show()   ------------------------------ 以上、よろしくお願い致します。

  • ロードしたアセンブリを常に保持したい

    Public Class Loader   Public Shared Function loadClass(ByVal className As String, Optional ByVal filePath As String = Nothing) As Boolean     If Not Type.GetType(className) Is Nothing Then       'アセンブリにロードされている場合は何もしない       Return True     Else       'アセンブリにロードされていない場合はDLLをロードする       If System.IO.File.Exists(filePath) = False Then           Return False       End If       Dim asm As [Assembly] = [Assembly].LoadFrom(filePath)       Dim classType As Type = asm.GetType(className)       If classType Is Nothing Then         classType = Nothing         asm = Nothing         Return False       End If     End If     Return True   End Function End Class http://www.atmarkit.co.jp/fdotnet/dotnettips/386createinstance/createinstance.html ここを参考にし、VB2005でこんなクラスを作りました。 ロードしたアセンブリは常にロードされた状態かと思っていて、 ロードしたアセンブリ内に存在するクラスを外部クラスでインスタンス化 できると思っていたのですが、どうやら上記コードのままでは その時限りのようなのです。 (つまり変数asmが有効なスコープ内のようです) 一度ロードしたアセンブリは、アプリケーションが閉じられるまで ロードされる状態にする方法はありませんでしょうか?