- PR -

VB.NETでのShellExecuteEx使用方法

投稿者投稿内容
mei
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 114
投稿日時: 2004-11-11 23:28
こんばんは、meiです。

引用:

現在WindowsCE上で動作するアプリを作成しています。
このアプリはVB.NETで作成していて、
ShellExecuteExを使用してボタンを押したときに指定したURLを開こうとしています。



ちょっと長いですがサンプルです。本体はExecute関数で、引数にファイル名、コマンドを渡します。エミュレータ上では動いたので大丈夫だとは思います。参考にしてみてください。

コード:
Imports System.Text
Imports System.Runtime.InteropServices

Structure SHELLEXECUTEINFO
    Public cbSize As Int32
    Public fMask As Int32
    Public hwnd As IntPtr
    Public lpVerb As IntPtr
    Public lpFile As IntPtr
    Public lpParameters As IntPtr
    Public lpDirectory As IntPtr
    Public nShow As Integer
    Public hInstApp As IntPtr
    Public lpIDList As IntPtr
    Public lpClass As IntPtr
    Public hkeyClass As IntPtr
    Public dwHotKey As Int32
    Public hIcon As IntPtr
    Public hProcess As IntPtr
End Structure 

Public Class Form1
    Inherits System.Windows.Forms.Form
    Friend WithEvents Button1 As System.Windows.Forms.Button
    Friend WithEvents MainMenu1 As System.Windows.Forms.MainMenu

    <DllImport("coredll")> _
    Private Shared Function ShellExecuteEx(ByRef ex As SHELLEXECUTEINFO) As Integer
    End Function

    <DllImport("coredll")> _
    Private Shared Function LocalAlloc(ByVal flags As Integer, ByVal size As Integer) As IntPtr
    End Function

    <DllImport("coredll")> _
    Private Shared Sub LocalFree(ByVal ptr As IntPtr)
    End Sub


#Region " Windows フォーム デザイナで生成されたコード "

    Public Sub New()
        MyBase.New()

        InitializeComponent()

    End Sub

    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        MyBase.Dispose(disposing)
    End Sub

    Private Sub InitializeComponent()
        Me.MainMenu1 = New System.Windows.Forms.MainMenu
        Me.Button1 = New System.Windows.Forms.Button
        '
        'Button1
        '
        Me.Button1.Location = New System.Drawing.Point(16, 8)
        Me.Button1.Text = "Button1"
        '
        'Form1
        '
        Me.Controls.Add(Me.Button1)
        Me.Menu = Me.MainMenu1
        Me.Text = "Form1"

    End Sub

#End Region

    Private Sub Execute(ByVal file As String, ByVal cmd As String)
        Dim fb As Byte() = Encoding.Unicode.GetBytes(file)
        Dim cb As Byte() = Encoding.Unicode.GetBytes(cmd)
        Dim pData As IntPtr = LocalAlloc(&H40, fb.Length + 1)
        Dim pVerb As IntPtr = LocalAlloc(&H40, cb.Length + 1)

        Marshal.Copy(fb, 0, pData, fb.Length)
        Marshal.Copy(cb, 0, pVerb, cb.Length)

        Dim info As New SHELLEXECUTEINFO
        With info
            .cbSize = 60
            .lpVerb = pVerb
            .lpFile = pData
            .nShow = 5
        End With

        ShellExecuteEx(info)

        LocalFree(pVerb)
        LocalFree(pData)

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Execute("\windows\default.htm", "open")

    End Sub
End Class



たけ
常連さん
会議室デビュー日: 2004/02/23
投稿数: 42
お住まい・勤務地: 神奈川県/東京都
投稿日時: 2004-11-11 23:47
諸農さん、きくちゃん、こんばんは。

自分の注意力、英語力の無さをさらに痛感いたしました。
やはりこれからはちゃんと英語も勉強します。
教えていただいたサイトは参考にさせていただきます。

meiさん、こんばんは。

わざわざWindowsCE上で動作する詳しいソースを教えていただき、
大変ありがとうございます。
残念ながら現在実機で試せないので、明日の朝にでも試してみます。
結果はご報告いたします。
たけ
常連さん
会議室デビュー日: 2004/02/23
投稿数: 42
お住まい・勤務地: 神奈川県/東京都
投稿日時: 2004-11-12 09:51
meiさん、おはようございます。

教えていただいたソースで実機で無事にIEを開くことが出来ました。
まだソースの中身で理解していないとこがあるので、
これから調べて完全に理解したいと思います。

アドバイスをいただいた皆様、どうもありがとうございました。
たけ
常連さん
会議室デビュー日: 2004/02/23
投稿数: 42
お住まい・勤務地: 神奈川県/東京都
投稿日時: 2004-11-12 19:54
すみません。よろしければもう少し知恵をお貸しください。

おかげさまでIEをアプリから起動することは出来ました。
しかし、起動したIEを×ボタンで閉じてもIEのプロセスが残ってしまうので、
アプリからプロセスを殺したいのですが、これはどうすればいいのでしょうか。

プロセスを殺すのはProcessクラスで出来るのは分かったのですが、
WindowsCEではそのProcessクラスが使えません。
ShellExecuteExで起動したプロセスを殺すための方法(API)があれば
教えていただけないでしょうか。

たびたび申し訳ありませんが、よろしくお願いいたします。
(Processクラスを使えるようにしたほうが早いのかな・・・)
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-11-12 22:12
諸農です。

OpenNETCFのProcessクラスにはKillメソッドが装備されていますよ。


mei
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 114
投稿日時: 2004-11-12 23:17
引用:

たけさんの書き込み (2004-11-12 19:54) より:

たびたび申し訳ありませんが、よろしくお願いいたします。
(Processクラスを使えるようにしたほうが早いのかな・・・)


諸農さんのレスにあるように、OpenNETCFを使ったほうが良いかも知れませんね。

http://www.microsoft.com/japan/msdn/net/compactframework/processmanager.asp
↑一応、Processクラスの実装方法についての情報をご紹介しておきます。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-11-13 12:04
引用:

しかし、起動したIEを×ボタンで閉じてもIEのプロセスが残ってしまうので、



それが、Pocket PC アプリケーションの標準的な振る舞いです。

それで都合が悪いなら、有無を言わさず TerminateProcess する前に WM_CLOSE を PostMessage をしてみるくらいは試してみてはどうでしょう。

有無を言わさず TerminateProcess するのは、ヘルプの解説でも推奨されていません。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
たけ
常連さん
会議室デビュー日: 2004/02/23
投稿数: 42
お住まい・勤務地: 神奈川県/東京都
投稿日時: 2004-11-15 09:02
みなさん、おはようございます。レスが遅くなり申し訳ありません。

やはりOpenNETCFのProcessを使うのが一番よさそうですね。
おとなしくそちらを使うようにします。
勉強のために、meiさんが教えてくれた方も試してみます。

引用:
それが、Pocket PC アプリケーションの標準的な振る舞いです。


やはりそうなのですね。
Pocket PC 自体をもう少し知らなければいけませんね。

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

スキルアップ/キャリアアップ(JOB@IT)