VBでファイルを開く

タグの編集
投稿者 XVMAX  (中学生) 投稿日時 2010/5/10 10:37:52
はじめまして、XVMAXです。

「[「TTSneo」、「なでしこ」(日本語プログラミングソフト)]、「Visual C++ 5.0」(家にあったもの) などで、プログラミングをしていました。
今回、VB2010でのプログラミングをやってみようと思いました。

早速質問ですが、「Resources」フォルダのEXEファイルを開くには、どうすればよいですか?

例;

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Label2.Text = "OSバージョン ;" & (Environment.OSVersion.ToString())

        Dim Ret As Long
     Ret = Shell("Resources\a.exe",VBNormalFocus)

End Sub

参考;「http://hanatyan.sakura.ne.jp/vbhlp/tap_shell.htm(VBレスキュー(花ちゃん) - 他の実行形式(*.EXE)ファイルの実行)」

教えてください。お願いします。
投稿者 るしぇ  (社会人) 投稿日時 2010/5/10 10:54:05
参考リンクの最初に
>プログラム名はフルパスで
と書いてあります。
投稿者 XVMAX  (中学生) 投稿日時 2010/5/10 10:57:05
すみません
自分の読み忘れでした。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2010/5/10 11:13:45
> http://hanatyan.sakura.ne.jp/vbhlp/tap_shell.htm
それは VB6 向けの記事です。VB.NET ならこっち。
http://hanatyan.sakura.ne.jp/dotnet/App03.htm

# ちなみに、そこのサイト(VBレスキュー)にも掲示板はありますよ。
# http://hanatyan.sakura.ne.jp/index.html

ちなみに、こちらのサイト(VB中学校)のサンプルはこちら。
http://homepage1.nifty.com/rucio/main/dotnet/Samples/Sample093ShellEx.htm


> Ret = Shell("Resources\a.exe",VBNormalFocus)
VB6 の Shell の戻り値は Long 型でしたが、
VB.NET の Shell の戻り値は Integer 型です。


> 早速質問ですが、「Resources」フォルダのEXEファイルを開くには、どうすればよいですか?
プロジェクトに Resources を含めているのだと思いますが、その場合、
ソリューション エクスプローラーから、Resources\a.exe のプロパティを見た場合、
【出力ディレクトリにコピー】の設定はどうなっていますか?

もしそれが、コピーする設定になっている場合は、exe の置かれるフォルダの下に
Resources というサブフォルダが出来、その中に a.exe が配置されるため、
パスさえ正しければ、Shell 関数や Process.Start で起動できます。

しかし、コピーしない設定になっている場合(通常はこの状態だと思います)には、
a.exe はプログラム中にバイナリデータとして埋め込まれた状態です。

埋め込まれたバイナリを取り出すには、
 Dim binary() As Byte = My.Resources.a
などとして、バイト配列に受けることができますが、そのバイト配列から
Shell や Process.Start でプログラムを直接起動することはできませんので、
System.IO.File.WriteAllBytes などを用いて、一度 exe ファイルとして
ディスク上に配置してから、改めてそれを実行する事になります。

ただし、その a.exe が .NET Framework で作成された物であるならば、
リフレクションを用いて起動できる可能性があります。

Imports System.Reflection
Public Class Form1
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
        Dim binary() As Byte = My.Resources.a

        Dim asm As System.Reflection.Assembly
        asm = Assembly.Load(binary)
        asm.EntryPoint.Invoke(asm, BindingFlags.Default, Nothing, Nothing, Nothing)
    End Sub
End Class

http://bbs.wankuma.com/index.cgi?mode=al2&namber=47083&KLOG=79
投稿者 (削除されました)  () 投稿日時 2010/5/10 11:14:43
(削除されました)