- PR -

VB.NETでShellExecuteExを使用する

投稿者投稿内容
空条Q太郎
会議室デビュー日: 2003/11/06
投稿数: 19
投稿日時: 2003-11-06 20:54
初書き込みです。
現在VB.NETで開発しています。
ShellExecuteExでファイルを起動したいのですがエラーになります。
いろいろ調べたのですが解決できませんでした。
どなたか解決策をお教えください。

error-------------------------------------------
オブジェクト参照がオブジェクト インスタンスに設定されていません。
------------------------------------------------

source------------------------------------------
Public Declare Function ShellExecuteEX Lib "shell32.dll" Alias "ShellExecuteEx" (ByVal lpExecInfo As SHELLEXECUTEINFO) As Integer
Public Declare Function GetDesktopWindow Lib "user32" () As Integer

Public Structure SHELLEXECUTEINFO
  Dim cbSize As Integer
  Dim fMask As Integer
  Dim hWnd As Integer
  Dim lpVerb As String
  Dim lpFile As String
  Dim lpParameters As String
  Dim lpDirectory As String
  Dim nShow As Integer
  Dim hInstApp As Integer
  Dim lpIDList As Integer
  Dim lpClass As String
  Dim hkeyClass As Integer
  Dim dwHotKey As Integer
  Dim hIcon As Integer
  Dim hProcess As Integer
End Structure

Public Const SEE_MASK_NOCLOSEPROCESS = &H40
Public Const SEE_MASK_FLAG_DDEWAIT = &H100
Public Const SEE_MASK_FLAG_NO_UI = &H400
Public Const SW_SHOW = 5

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  Dim path As String = 起動したいファイル(.txt)
  Dim shellInfo As SHELLEXECUTEINFO

  With shellInfo
    .cbSize = Len(shellInfo)
    .fMask = SEE_MASK_NOCLOSEPROCESS Or SEE_MASK_FLAG_DDEWAIT Or SEE_MASK_FLAG_NO_UI
    .hWnd = GetDesktopWindow
    .lpVerb = "open" & vbNullString
    .lpFile = path & vbNullString
    .lpParameters = vbNullString
    .lpDirectory = vbNullString
    .nShow = SW_SHOW
    .hInstApp = 0
    .lpIDList = 0
  End With
    
  ShellExecuteEX(shellInfo)
End Sub
--------------------------------------------------

長くなりましたがよろしくお願いします。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2003-11-06 21:01
引用:

ShellExecuteExでファイルを起動したいのですがエラーになります。



Processクラスで事は足りませんか?

引用:

オブジェクト参照がオブジェクト インスタンスに設定されていません。



どこで発生しているんですか?発生箇所のソースコードが反転表示してますよね?
どこかの変数がNothingになっているようですが。
空条Q太郎
会議室デビュー日: 2003/11/06
投稿数: 19
投稿日時: 2003-11-06 21:15
ご回答ありがとうございます。

>Processクラスで事は足りませんか?

実はopenではなくprintでファイル印刷をしたかったのです。
ただprintでエラーが出たためopenで試していました。
エラーの発生箇所・メッセージは同じです。

>どこで発生しているんですか?発生箇所のソースコードが反転表示してますよね?
>どこかの変数がNothingになっているようですが。

ShellExecuteEX(shellInfo)の箇所です。
また構造体で宣言しセットしたメンバをコンソール出力しました。
-----Console-----
cbSize = 60
fMask = 1024
hWnd = 65556
lpVerb = open
lpFile = 出力したいファイルパス
lpParameters =
lpDirectory =
nShow = 5
hInstApp = 0
lpIDList = 0
-----------------

よろしくお願いします。
KeroKero
常連さん
会議室デビュー日: 2003/11/06
投稿数: 26
投稿日時: 2003-11-06 23:25
VB6からの移植の注意点がヘルプの中にあるのですが,この中にメッセージやスレッドを扱うAPIについて動作保証できない旨の記述があったと思います(2行程度)。
ShellExecuteExがこれに該当するかどうかはわかりませんが,私はGetMessageで同じエラーがでました。

答えになってなくて申し訳ありませんが,参考までに。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2003-11-07 00:00
引用:

>Processクラスで事は足りませんか?

実はopenではなくprintでファイル印刷をしたかったのです。
ただprintでエラーが出たためopenで試していました。
エラーの発生箇所・メッセージは同じです。



ProcessクラスのStartメソッドの引数に
ProcessStartInfoクラスのインスタンスを渡す方法のことを言っているのですが、
エラーの発生箇所・メッセージが同じとは?

Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-11-07 00:36
こんにちわ。諸農です。
引用:

実はopenではなくprintでファイル印刷をしたかったのです。
ただprintでエラーが出たためopenで試していました。
エラーの発生箇所・メッセージは同じです。



こちらの参考コードでは、PRINTしているようですが、参考になりますか?

ms-help://MS.NETFrameworkSDKv1.1.JA/cpref/html/frlrfSystemDiagnosticsProcessClassTopic.htm

ではでは(^^)/

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
空条Q太郎
会議室デビュー日: 2003/11/06
投稿数: 19
投稿日時: 2003-11-07 10:31
大変遅くなりました。すみません。

よねKENさん、KeroKeroさん、Jubeiさんありがとうございました。

私の言葉不足と無知のため正確にお伝えできませんでした。

>実はopenではなくprintでファイル印刷をしたかったのです。
>ただprintでエラーが出たためopenで試していました。
>エラーの発生箇所・メッセージは同じです。

の真意は自動印刷がしたいので
"ShellExcecuteEx"でlpVerbにprintとしたところエラーになりましたので
lpVerbをopenにし調査をしましたら
エラーの発生箇所"ShellExecuteEX(shellInfo)"、メッセージが同じということです。

よねKENさん、Jubeiさん
以前ShellExcecuteExを用いて自動印刷をしたことがありまして(Delphi)
固執しすぎました。すみません。

Processクラスで再度調査致します。
空条Q太郎
会議室デビュー日: 2003/11/06
投稿数: 19
投稿日時: 2003-11-07 18:49
Processクラスで自動印刷できましたが、新たな問題に悩まされています。
スレッドを変えた方がよろしかったでしょうか?。

PDF出力時AcrobatReaderが終了せず最小化され残ってしまいます。
AcrobatReaderを終了する方法をお教え下さい。

Processクラスのメソッドで色々試しましたが、
うまく終了できません。宜しくお願いします。

下記コードなのですが
---------------------------------------
Dim startInfo As New ProcessStartInfo()
Dim path As String = "ファイルパス"

With startInfo
  .FileName = path
  .Verb = "print"
End With

Process.Start(startInfo)
---------------------------------------
ファイルパスにExcelファイル(.xls)を指定すると
  Excel起動→印刷開始→Excel終了

ファイルパスにEditerファイル(.txt)を指定すると
  Editer起動→印刷開始→Editer終了

ファイルパスにPdfファイル(.pdf)を指定すると
  AcrobatReader起動→印刷開始

印刷はExcel、Editer、Pdf全て成功します。

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