アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になります

すみません、先日(8/13)に投降したばかりの質問の再投稿で申し訳ございませんが
教えてもらった大村あつしさんの「Win32 API」の記事やほかの記事をみていろいろ
試してみましたがみんな上手くいきませんでした

そこで質問なのですが
大村あつしさんの本の中に「VBAから以下のような起動する手法は推奨できません。
あくまでもWaitForInputIdle関数の使用例として参考にしてください」と有ります

これは、VBAで出来ないという事なのでしょうか?

また、ほかのウェブから下記のプログラムを試してみました
Option Explicit
Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadId As Long
End Type

Private Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type

Private Const STARTF_USESHOWWINDOW = &H1
Private Const NORMAL_PRIORITY_CLASS = &H20&

Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" _
(ByVal lpApplicationName As String, _
ByVal lpCommandLine As String, _
lpProcessAttributes As Any, _
lpThreadAttributes As Any, _
ByVal bInheritHandles As Long, _
ByVal dwCreationFlags As Long, _
lpEnvironment As Any, _
ByVal lpCurrentDriectory As String, _
lpStartupInfo As STARTUPINFO, _
lpProcessInformation As PROCESS_INFORMATION) As Long

Private Declare Function WaitForInputIdle Lib "user32" _
(ByVal hProcess As Long, _
ByVal dwMilliseconds As Long) As Long

Public Function ShellEx(ByVal sPath As String, Optional ByVal sParam As String = "") As Boolean
Dim tStInfo As STARTUPINFO
Dim tPrInfo As PROCESS_INFORMATION

On Local Error GoTo Error_Handler

ShellEx = False
With tStInfo
.cb = LenB(tStInfo)
.dwFlags = STARTF_USESHOWWINDOW
.wShowWindow = 6
End With

'アプリケーションを実行しプロセスを作成する
If CreateProcess(vbNullString, sPath & " " & sParam, ByVal 0&, _
ByVal 0&, 1&, NORMAL_PRIORITY_CLASS, ByVal 0&, _
vbNullString, tStInfo, tPrInfo) = 0 Then GoTo Error_Handler
Do
If WaitForInputIdle(tPrInfo.hProcess, &HFFFFFFFF) = 0 Then Exit Do
Loop
ShellEx = True

Exit Function
'====== エラー処理
Error_Handler:
MsgBox "?G???[No:" & Err.Number & vbCrLf & "?G???[??e:" & Err.Description, vbCritical
Err.Clear
End Function

Sub Test()
Dim strApplicationName As String
strApplicationName = "C:\Program Files\Autodesk\AutoCAD LT 2018\Acadlt.exe"
Debug.Print ShellEx(strApplicationName)
End Sub

起動させたら、すぐにTrueが出てプログラムは入力状態を待つことは出来ないようです

以上、何度もすいません
よろしくお願い申し上げます

A 回答 (1件)

大村あつしさんの本の中に「VBAから以下のような起動する手法は推奨できません。


あくまでもWaitForInputIdle関数の使用例として参考にしてください」と有ります
これは、VBAで出来ないという事なのでしょうか?

出来ないと言う事ではありません。
私は、本を拝読したことがないので詳細は分かりませんが、文中に推奨しない根拠が示されていると思います。
Win32 API と言う事で、WindowsOS、Excel、AutoCAD、共に32bit版だと思いますが、
仕様において的外れかもしれませんが、を起動する目的の為だけなら、あくまで、だけですが、
もっとシンプルにWshShell Runメソッドで実現した方が良いかと思います。

参考:https://vbabeginner.net/vba%E3%81%A7%E4%BB%96%E3 …


>起動させたら、すぐにTrueが出てプログラムは入力状態を待つことは出来ないようです
どの様な状態で何を示しているか、私には、わかりません。プログラムとは何のプログラムですか?

If WaitForInputIdle(tPrInfo.hProcess, &HFFFFFFFF) = 0 Then Exit Do
0が返っているにもかかわらず、起動できないと言う事でしょうか?

>先日(8/13)に投降した
記事も見つかりませんでしたし、AUTOCADについても知識がありませんが

仕様などわからないので、AUTOCADのAPIでしたら、フォーラム(US)があるようですので、そちらに投稿された方が
有益な情報を得られる可能性が高いと思います。また、起動に関する記事もすでにあるみたいですね。

Visual Basic Customization https://forums.autodesk.com/t5/visual-basic-cust …
    • good
    • 0
この回答へのお礼

ありがとうございます
何度も申し訳ございません

お言葉に従い、鍛錬していきたいと思います
これからもよろしくお願い申し上げます

お礼日時:2019/08/23 09:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!