- Rick Domogalik
- PowerBuilder
- Monday, 2 March 2020 04:05 PM UTC
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
Find Questions by Tag
Helpful?
If a reply or comment is helpful for you, please don’t hesitate to click the Helpful button. This action is further confirmation of their invaluable contribution to the Appeon Community.