- ベストアンサー
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() という方法を見つけて試してみたのですが、"起動したい実行ファイルのメインフォームのクラス名"がわからずオブジェクト参照されませんでした。 知識不足でどういった検索ワードで検索したらいいかもわからない状態です。どうか皆さんのお知恵を拝借させていただけないでしょうか?
- negi0810
- お礼率35% (7/20)
- Visual Basic
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Office2007は確認していませんが、少なくともWord 2003ではアセンブリを取得することができませんでした。アセンブリが取得出来ない限り、リフレクションでクラス生成…というアプローチは難しい(というか不可能?)かと思います。 VB6.0時代はOLEで他のアプリケーションを取り込む方法がありました。.NETでOLEコンテナはなくなってしまったようですが、OLEの仕様から果敢に挑戦されているサイトを見つけたので、参考にしてみてください。 http://www5.plala.or.jp/atata/net/
その他の回答 (1)
関連するQ&A
- 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となってしまい、エラーが発生してしまいます。 もし、何か勘違いをして使っているようでしたら、いいアドバイスが頂けたらと思います。 また、上の方法以外のやり方を知っている方がいらっしゃいましたらご教授いただいと願います。 よろしくお願いします。
- ベストアンサー
- Visual Basic
- .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で事前にコンパイルをしてみましたが効果なしでした。 また、ページアドレスをそれぞれ別のアドレスにしても効果なしでした。
- 締切済み
- その他(プログラミング・開発)
- 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() ----
- 締切済み
- C・C++・C#
- 指定した名前のサブフォームがあれば開きたいです。
指定した名前のサブフォームがあれば開きたいです。 現在、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個目のフォームも開かなくなりました。 助けて下さい。 是非ご教示宜しくお願い致します。
- 締切済み
- Visual Basic
- VB2010でMDI親フォームから子フォームを表示
VB2010でソフトを作っております。 MDI親フォームから子フォームを表示させたいのですが…。 過去に少しだけVB6を使っていたことがありますが、クラスという概念に苦労しております インスタンスや初期化といったところをうまく扱えばとは思うのですが、よろしくご指導お願いいたします。 1.MDI親フォーム(Form1)のボタンを押し、子フォーム(Form2)を表示させる 2.子フォームが表示されていなかったら表示させる 3.子フォームが表示されていたら何もしない これだけの事ですがずいぶん悩んでおります。 全コードがこれです。 Public Class Form1 Private f2 As New Form2 Private Sub Form1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.IsMdiContainer = True End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim fChild As Form() = Me.MdiChildren For Each f As Form In fChild If f.Text = "Form2" Then Exit Sub End If Next f2 = New Form2 f2.MdiParent = Me f2.Show() f2.Activate() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click If f2 Is Nothing OrElse f2.IsDisposed Then f2 = New Form2 f2.MdiParent = Me End If f2.Show() f2.Activate() End Sub End Class ボタン1でもボタン2でも、期待する動作はするのですが、 ボタン1ではアクティブになっているフォームの名前を力技で取得している気がして… ボタン2では子フォーム(Form2)をすでに表示している状態でもさらにShowをしているのが気に入らなくて… もっとスマートな方法がありましたら、ご指導お願いします。
- ベストアンサー
- Visual Basic
- ロードしたアセンブリを常に保持したい
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が有効なスコープ内のようです) 一度ロードしたアセンブリは、アプリケーションが閉じられるまで ロードされる状態にする方法はありませんでしょうか?
- ベストアンサー
- Visual Basic
- VB.NETのMDIアプリについて
現在VB.NET EXP 2008を用いてMDIアプリを作成しています。 下記のような3種類のフォームを作成し,アプリ開始時にMAINの中にMENUを表示させ, MENU上のボタンをクリックすると,MASTERを表示させたいと考えています。 親フォーム : MAIN 子フォーム : MENU 子フォーム : MASTER まずはMAINのLoadイベントで Dim fMENU As New MENU fMENU.MdiParent = Me fMENU.Show() と記述して実行するとMENUがMAIN内に表示されます。 次に,MENU上のボタンクリックイベントで Dim fMASTER as New MASTER Dim fMAIN as New MAIN fMASTER.MdiParent = fMAIN fMASTER.Show() として実行してもMASTERが表示されません。 そこで,MAINのLoadイベントに Dim fMASTER as New MASTER fMASTER.MdiParent = Me と追記し,MENU上のボタンクリックイベントに Dim fMASTER as New MASTER fMASTER.Show() として実行すると,MASTERは表示されますが, MAINの外側に表示されてしまいます。 どのようにすれば,MAIN内にMASTERを 表示させることが出来ますでしょか?
- ベストアンサー
- Visual Basic
- 子フォームから開いたフォームと親子関係を結びたい(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() ------------------------------ 以上、よろしくお願い致します。
- ベストアンサー
- Visual Basic
- C#でdllを動的に使用
下記のソースコードでPluginのTestClassがstaticクラスの場合動かないのですが、 staticクラスのstaticメンバー(いわゆるただの関数)を呼び出す方法を教えてください。 お願いします。 Assembly assem = Assembly.LoadFrom("Plugin.dll"); Type AssType = assem.GetType("Plugin.TestClass"); dynamic obj = Activator.CreateInstance(AssType); label1.Text = obj.GetMessage();
- ベストアンサー
- C・C++・C#
- 作成したインスタンスの内容を変更できないようにしたい
//C#の本体プログラム class Abstract { public virtual void Draw() {} } class Base { public Base(Abstract image) { this.image = image; } } class Imager { //dllファイルをアセンブリとして読み出す System.Reflection.Assembly asm = System.Reflection.Assembly.LoadFrom(dll); foreach (Type t in asm.GetTypes()) {//インスタンス作成 Base item = new Base((Abstract)asm.CreateInstance(t.FullName)); } } ----- //C#で記述されたファイルdll class Override : Abstract { public override void Draw() {略} } ----- Baseのitemインスタンスを作成し、item.imageにOverrideのメソッドが作成されるのですが、 item.imageの内容を変更できないように、かつ読み出しのみ可能にしたいのです。 どういう方法を取ればいいのかの指針ややり方を教えてください。
- 締切済み
- C・C++・C#