Hi All,
Our PowerBuilder Application (PB 2021 Build 1506 ) is not able to check if outlook.exe is open
with the Apps for Enterprise (new version of Office that M365) installed on a user machine. Our code is checking if Outlook is open prior to opening an email in a compose mode (send, reply or import) mode
but instead get the following error message: users get the error message: "Microsoft Outlook is not available"
Please provide any suggestions.
*Reproduce Steps:
Install Office M365 outlook and run the script below:
/*code start*/ nvo_process lnvo_process /*non visual user objected, not inherited from any ancestors. code attached for this object*/ lb_outlook_running = lnvo_process.of_is_process_running("outlook.exe") If Not lb_outlook_running Then Messagebox("Outlook Error","Microsoft Outlook is not available " + "~r~nPlease open your Microsoft Outlook to Continue with Emails Reply or Import!") Return End If
/*code end*/
Remarks:
1. This code works find in we downgrade office back to Office 2016.
2. Office 365 once installed still have the executable for outlook called "outlook.exe"
/*Code of the nvo_process non visual user object not inherited*/
Declaration Local External Function:
Function Boolean EnumProcesses(REF processEntry Process, long cb, REF long cbNeeded ) Library "PSAPI.DLL"
Code for of_is_process_running:
// of_is_process_running
ProcessEntry pe_Process // Window structure (array of 500 ulong)
ModuleEntry me_Module // Window structure (array of 100 long)
PROCESS_MEMORY_COUNTERS pmc
long ll_size_of_process = 2000 // Size of Process
long ll_size_of_module = 400 // Size of Module
long ll_needed_size_of_process // returned size of Process
long ll_needed_size_of_module // returned size of Module
long ll_resName // size of returned name of the module
long li_cnt // for looping through processes
int li_total // for looping through processes
long ll_process_found
boolean lb_resultP // return codes for EnumProcesses and EnumProcessModules
boolean lb_resultM
string ls_module_name // Name of the module
string ls_process_to_find
TRY
ls_process_to_find = as_process_name
lb_resultP = EnumProcesses(pe_Process, ll_size_of_process, ll_needed_size_of_process)
IF lb_resultP THEN
li_total = integer(ll_needed_size_of_process / 4)
FOR li_cnt = 1 TO li_total
iul_HandleP[li_cnt] = OpenProcess(PROCESS_ALL_ACCESS, FALSE, &
pe_Process.lpIdProcess[li_cnt])
lb_resultM = EnumProcessModules(iul_HandleP[li_cnt], me_Module, &
ll_size_of_module, ll_needed_size_of_module)
IF ll_needed_size_of_module >= 4 THEN
IF GetProcessMemoryInfo(iul_HandleP[li_cnt], pmc, 40) THEN
ls_module_name = Space(254)
ll_resName = GetModuleBaseNameA(iul_HandleP[li_cnt], &
me_Module.lpidmodule[1], ls_module_name, 254)
IF Trim(Lower(ls_module_name)) = Trim(Lower(ls_process_to_find)) THEN
ll_process_found ++
END IF
END IF
END IF
CloseHandle(iul_HandleP[li_cnt])
NEXT
IF ll_process_found > 0 THEN
RETURN TRUE
ELSE
RETURN FALSE
END IF
ELSE
RETURN FALSE
END IF
CATCH (exception e1)
MessageBox( "Exception Error", e1.getMessage() )
CATCH (runtimeerror r1)
MessageBox("Run Time Exception", r1.getMessage())
CATCH (throwable t1)
MessageBox("Other Exception", t1.getMessage())
END TRY