3

1 つまたは複数のドキュメントをダウンロードし、Windows 関数を使用して印刷するために使用される Word マクロに VBA コードがありますShellExecuteEx。コードは、Windows 2000、XP、および 7 (32 ビットおよび 64 ビット) 上の Word バージョン 97、2000、2003、2007、および 2010 (32 ビット) で正常に実行されます。

ただし、64 ビットの Word 2010 および 2013 では の呼び出しが失敗します。MSDNで文書化され、Win32API_PtrSafe ファイルで指定されているように、ShellExecuteEx VBA7 (64 ビット) の宣言を更新しました。例えば:

#If VBA7 Then
Type SHELLEXECUTEINFO
    cbSize As Long
    fMask As Long
    hwnd As LongPtr
    lpVerb As String
    lpFile As String
    lpParameters As String
    lpDirectory As String
    nShow As Long
    hInstApp As LongPtr
    lpIDList As LongPtr
    lpClass As String
    hkeyClass As LongPtr
    dwHotKey As Long
    hIcon As LongPtr
    hProcess As LongPtr
End Type
Declare PtrSafe Function ShellExecuteEx Lib "shell32.dll" Alias "ShellExecuteExA" _
    (sei As SHELLEXECUTEINFO) As Boolean
#End If

使い方はこんな感じです。

Dim bReturn As Boolean
Dim sei As SHELLEXECUTEINFO

With sei
    .cbSize = Len(sei)                  ' size of the object
    .fMask = SEE_MASK_NOCLOSEPROCESS    ' indicate that we want a hProcess back
    .hwnd = GetDesktopWindow()          ' the window we are calling from
    .lpVerb = "print"                   ' print the file
    .lpFile = lpFile                    ' the file we want to print
    .lpParameters = vbNullString        ' no parameters because its a file
    .lpDirectory = vbNullString         ' use the current dir as working dir
    .nShow = SW_HIDE                    ' state of the window to open
End With

bReturn = ShellExecuteEx(sei)

If bReturn Then
    WaitForSingleObject sei.hProcess, 5000
    CloseHandle sei.hProcess
    DoEvents
Else
    MsgBox "ShellExecuteEx failed with code: " & Err.LastDllError
End If

32 ビット Word では機能しますが、64 ビット Word では呼び出しはShellExecuteEx常に失敗し、5 (SE_ERR_ACCESSDENIED) が返されます。fMask(SEE_MASK_NOASYNC を含む)のフラグ値の範囲を試しましhwndnShow

単純なShellExecute関数は 32 ビットと 64 ビットの両方の Word で機能しますが、柔軟性がありません。複数のドキュメントを印刷する場合に優れているため、使用したいと考えてShellExecuteExいます。別の印刷要求を送信する前に、印刷アプリケーション (Word、Adobe Reader など) の準備が整うのを待つことができます。それ以外の場合、アプリケーションの準備ができていない場合、印刷要求は失敗します。(印刷要求の間に数秒待つだけで試しましたが、信頼できません。)

ShellExecuteファイルを印刷ShellExecuteExしてもアクセスが拒否されて失敗するのはなぜですか?

4

1 に答える 1

2

64 バージョンの OS では、Len の代わりに LenB を使用する必要があります。全体の答えはここにあります: http://www.utteraccess.com/forum/office-2010-x64-bit-qu-t1914261.html

于 2013-12-12T22:09:16.383 に答える