Hej skulle gärna vilja få lite hjälp till det jag ser som ett jätteproblem! Har ett litet script som skriver ut ett Word dokument, problemet är att scriptet stänger Word innan utskriften är klar. Om jag tar bort "objWord.Quit" så ligger Word kvar och körs i bakgrunden! Tacksam för all hjälp! Testa att lägg end if över objWord.Quit och Set objWord = Nothing. Istället för att använda words objekten kan du kapsla ett anrop till ShellExecuteEx i en activX dll. Tack för inlägget, jag får inte det här till att fungera i heller. Den säger att dokumentet har skrivits ut men det har det inte! Den startar Word i bakgrunden men samma problem igen, den stänger aldrig ner utan startar en ny Word varje gång man vill skriva ut. Allting ligger i bakgrunden och körs vilket syns om man kollar vilkar processer som körs på datorn. Jag vet inte om jag har implementerat ASP koden rätt men jag har provat diverse sätt. Jag kör iofs win 2000 och office 2000. Kan bero på det. Jo det är så att den öppnar Word nu, men utan något dokument! Vet inte om den inte får in något filnamn eller vad som är felet? Använder jag koden som jag hade från början fungerar det, så Querystringen fungerar väl som den ska! ShellExecute är nog ett dålig lösning. Ber om ursäkt för att jag föreslog den. Den skapar en process, använder dde eller argument. Hej! Tack för inlägget ska prova det! Har dock löst det genom att man i Word går in Alternativ - Utskrift - och avmarkerar "Bakgrundsutskrift". Då fungerar allt perfekt och Word stänger sig efter att dokumentet har skrivits ut.objWord stänger för tidigt?
Dim strDocPath, bolPrintDoc, objWord
strDocPath = Request.QueryString ("FileName")
If strDocPath > "" Then
Set objWord = CreateObject ("Word.Application")
objWord.Visible = FALSE
objWord.Documents.Open strDocPath
'If bolPrintDoc = "PrintDoc" Then
objWord.PrintOut
Response.Write "Ditt dokument skrivs nu ut...<P>"
Response.Write " Tillbaka "
objWord.Quit
Set objWord = Nothing
End if
Sv: objWord stänger för tidigt?
Sv: objWord stänger för tidigt?
Här är exempel:
* Skapa ett ActivX dll Projekt
* Byt Namn på Projektet till APIHelper
* Byt namn på class1 till ShellExecuteEx
* Klistra in följande kod i ShellExecuteEx Classen och kompilera den till en dll
Option Explicit
Private Const SW_HIDE = 0
Private Const SW_MAXIMIZE = 3
Private Const SW_MINIMIZE = 6
Private Const SW_RESTORE = 9
Private Const SW_SHOW = 5
Private Const SW_SHOWDEFAULT = 10
Private Const SW_SHOWMAXIMIZED = 3
Private Const SW_SHOWMINIMIZED = 2
Private Const SW_SHOWMINNOACTIVE = 7
Private Const SW_SHOWNA = 8
Private Const SW_SHOWNOACTIVATE = 4
Private Const SW_SHOWNORMAL = 1
Private Const SE_ERR_FNF = 2
Private Const SE_ERR_PNF = 3
Private Const SE_ERR_ACCESSDENIED = 5
Private Const SE_ERR_OOM = 8
Private Const SE_ERR_DLLNOTFOUND = 32
Private Const SE_ERR_SHARE = 26
Private Const SE_ERR_ASSOCINCOMPLETE = 27
Private Const SE_ERR_DDETIMEOUT = 28
Private Const SE_ERR_DDEFAIL = 29
Private Const SE_ERR_DDEBUSY = 30
Private Const SE_ERR_NOASSOC = 31
Private Const SEE_MASK_CLASSKEY = &H3
Private Const SEE_MASK_CLASSNAME = &H1
Private Const SEE_MASK_CONNECTNETDRV = &H80
Private Const SEE_MASK_DOENVSUBST = &H200
Private Const SEE_MASK_FLAG_DDEWAIT = &H100
Private Const SEE_MASK_FLAG_NO_UI = &H400
Private Const SEE_MASK_HOTKEY = &H20
Private Const SEE_MASK_ICON = &H10
Private Const SEE_MASK_IDLIST = &H4
Private Const SEE_MASK_INVOKEIDLIST = &HC
Private Const SEE_MASK_NOCLOSEPROCESS = &H40
Private Type SHELLEXECUTEINFO
cbSize As Long
fMask As Long
hwnd As Long
lpVerb As String
lpFile As String
lpParameters As String
lpDirectory As String
nShow As Long
hInstApp As Long
' Optional fields
lpIDList As Long
lpClass As String
hkeyClass As Long
dwHotKey As Long
hIcon As Long
hProcess As Long
End Type
Private Declare Function ShellExecuteEx Lib "shell32.dll" Alias "ShellExecuteExA" (lpExecInfo As SHELLEXECUTEINFO) As Long
Public Function PrintFile(ByVal FileName As String, Optional ByVal Directory As String) As Boolean
Dim lReturn As Long
Dim lpExecInfo As SHELLEXECUTEINFO
With lpExecInfo
.cbSize = Len(lpExecInfo)
.fMask = SEE_MASK_FLAG_NO_UI
.hwnd = 0&
.lpVerb = "print"
.lpFile = FileName
.lpDirectory = Directory
.nShow = SW_HIDE
End With
lReturn = ShellExecuteEx(lpExecInfo)
Select Case lpExecInfo.hInstApp
Case SE_ERR_FNF
Err.Raise vbObjectError + SE_ERR_FNF, "PrintFile()", "File not found."
Case SE_ERR_PNF
Err.Raise vbObjectError + SE_ERR_PNF, "PrintFile()", "'Path not found."
Case SE_ERR_ACCESSDENIED
Err.Raise vbObjectError + SE_ERR_ACCESSDENIED, "PrintFile()", "Access denied."
Case SE_ERR_OOM
Err.Raise vbObjectError + SE_ERR_OOM, "PrintFile()", "Out of memory."
Case SE_ERR_DLLNOTFOUND
Err.Raise vbObjectError + SE_ERR_DLLNOTFOUND, "PrintFile()", "Dynamic-link library not found."
Case SE_ERR_SHARE
Err.Raise vbObjectError + SE_ERR_SHARE, "PrintFile()", "Cannot share an open file."
Case SE_ERR_ASSOCINCOMPLETE
Err.Raise vbObjectError + SE_ERR_ASSOCINCOMPLETE, "PrintFile()", "File association information not complete."
Case SE_ERR_DDETIMEOUT
Err.Raise vbObjectError + SE_ERR_DDETIMEOUT, "PrintFile()", "DDE operation timed out."
Case SE_ERR_DDEFAIL
Err.Raise vbObjectError + SE_ERR_DDEFAIL, "PrintFile()", "DDE operation failed."
Case SE_ERR_DDEBUSY
Err.Raise vbObjectError + SE_ERR_DDEBUSY, "PrintFile()", "DDE operation is busy."
Case SE_ERR_NOASSOC
Err.Raise vbObjectError + SE_ERR_NOASSOC, "PrintFile()", "File association not available."
Case Is > 32
PrintFile = True
Case Else
PrintFile = False
End Select
End Function
Använda den från ASP:
<%
Dim Shell
Set Shell = Server.CreateObject("APIHelper.ShellExecuteEx")
If Shell.PrintFile(FileName) Then
Response.Write "Dokument har skrivits ut!"
Else
Response.Write "Dokument har ej skrivits ut!"
End If
%>Sv: objWord stänger för tidigt?
Sv: objWord stänger för tidigt?
Annars kan du prova att öppna en word session manuelt.
Den bör då använda sig av den. Och inte öppna och stänga word.
Vilka rättigheterna har internet kontot? Kan ju vara så att det inte får lov att skriva ut.
Eventuellt kan lokala inställningar för internet kontot inte var konfigurerade eller felaktiga. Sv: objWord stänger för tidigt?
Koden ser ut så här för tillfället:
<% Dim FileName
FileName = Request.QueryString ("FileName")
%>
<%
Dim Shell
Set Shell = Server.CreateObject("APIHelper.ShellExecuteEx")
If Shell.PrintFile(FileName) Then
Response.Write "Dokument har skrivits ut!"
Else
Response.Write "Dokument har ej skrivits ut!"
End if
%> Sv: objWord stänger för tidigt?
Alternativ lösning kan ju vara att använda en fil eller databas med en lista över dokument som skall skrivas ut. Och låta ett separat program läsa fil eller databas och skriva ut dokumenten.
Då slipper du belasta IIS med att öppna, skriva ut och stänga word.
Nackdelen är att du inte får dina operationer direkt bekräftade.
Kan ju istället visa en lista över utskrifts jobb. Med en flagga vilka som är genomförda, skrivs ut eller ej är behandlade och om de lyckades eller ej. Lösning?
Jag lider med dig. Har själv setat med samma problem i veckor. Kom av en slump på att man kan styra om koden ska exekveras syncront eller asyncront och detta beror på hur man öppnar dokumentet. Testa följande:
Dim appWD As Word.Application
Dim DocToPrint As Document
Set appWD = GetObject(, "Word.Application")
Set DocToPrint = appWD.Documents.Add("C:\test.doc")
DocToPrint.PrintOut False 'Här avgör du om det ska vara syncront eller asyncront (Normalt True om inget annat anges)
DocToPrint.Close
appWD.Quit
Set DocToPrint = Nothing
Set appWD= Nothing
Om du öppnar med add-metoden går det att styra om koden ska rulla vidare eller vänta på att dokumentet är utskrivet. Detta borde även funka i skript om du bara anger object.
mvh
MickeSv: Lösning?