I have an application that uses ShellExecute and Printto to Batch print documents. The program needs to be very specific and print them in order. The issue I am having is the order. When I send the batch print, based on what native application is opening the file, they go out of order. For example, it takes slightly longer to open PDF than a word doc, so word will print 3-4 in the time that it takes adobe to open and print.
I have found some examples in visual studio of how to handle this by waiting on a return code that the print has been sent to the queue, I am struggling getting the process to return the handle to tell me it is done.
Here is the Visual Studio example:
/////////////////////////////////////////////////////////////////
SHELLEXECUTEINFO ShellInfo;
ZeroMemory( & ShellInfo, sizeof( SHELLEXECUTEINFO ) );
ShellInfo.cbSize = sizeof( SHELLEXECUTEINFO );
ShellInfo.lpVerb = TEXT( "printto" );
ShellInfo.lpFile = pszFile;
ShellInfo.lpParameters = szPrinter;
ShellInfo.nShow = SW_SHOWMINIMIZED;
ShellInfo.fMask = SEE_MASK_FLAG_DDEWAIT
| SEE_MASK_NOCLOSEPROCESS ;
if( ShellExecuteEx( & ShellInfo ) )
{
if( (int) ShellInfo.hInstApp > 32 )
{
if( ShellInfo.hProcess )
{
DWORD dwExitCode = STILL_ACTIVE;
while( dwExitCode == STILL_ACTIVE )
{
if( ! GetExitCodeProcess( ShellInfo.hProcess, & dwExitCode ) )
{
dwExitCode = 0;
}
}
CloseHandle( ShellInfo.hProcess );
}
}
}
/////////////////////////////////////////////////////////////////
And this is my PowerBuilder code:
I have defined this Local External Function:
FUNCTION long ShellExecute( ulong hWnd, string Operation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd ) LIBRARY "shell32.dll" ALIAS FOR "ShellExecuteW"
Here is a copy of my script:
string ls_path, ls_doc, ls_recnum
long ll_count, ll_tot
integer li_return_code
string ls_null
long ll_null
SetNull(ls_null)
SetNull(ll_null)
//loop through list
ll_count = 1
dw_print_prod.settrans(sqlca)
dw_print_prod.retrieve(is_current_prod)
ll_tot = dw_print_prod.rowcount()
do while ll_count <= ll_tot
ls_path = dw_print_prod.getItemstring(ll_count, "doc_path")
ls_doc = dw_print_prod.getItemstring(ll_count, "doc_id")
li_return_code = ShellExecute(ll_null, "printto", ls_path, ls_null, ls_null, 0)
if li_return_code < 32 then
messagebox('Error ' + string(li_return_code), 'Error sending print - ' + ls_doc + '.')
end if
// lf_activity_add(ls_recnum, 'Printed - Bulk', '', '')
ll_count = ll_count + 1
loop
ll_return = in_rwait.of_ShellRun(ls_filename, "PrintTo", Hide!)
So to complete the bulk print, the user has to click close on acrobat after each print. With potentially thousands of docs needing printed in order in these batches, not going to work.
We have done some testing and see that the run and wait function does not time out or return until the user closes acrobat. It stays in the called function no matter how long we wait.
Have you seen this type of behavior with run and wait and Acrobat?
Any help would be greatly appreciated.