投稿者 魔界の仮面弁士  (社会人) 投稿日時 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