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
You're wrong about one thing. A 32 bit Powerbuilder application works perfectly fine with Outlook 64 bits (when using OLE).
Now what I'm not sure about is whether the API function would detect a 64 bit Outlook running or not. (Function Boolean EnumProcesses(REF processEntry Process, long cb, REF long cbNeeded ) Library "PSAPI.DLL")
If, however, Chris was referring to the use of the external function call EnumProcesses from a 32 bit PB application with respect to 64 bit processes then he is correct as it will not include 64 bit processes in the list. Even though the Microsoft docs only refer to the bitness having to be the same when using the external function call EnumProcessModules in order to include 64 bit processes, I believe it also applies to the EnumProcesses function too and is an omission in their docs.
See my reply for another approach (using 1 line) to accomplish what the OP wanted to do...but I like your approach that uses WbemScripting!
Regards,
Mark
Yes I totally agree with what you are saying. That was also what I tried to say. Plus I wasn't sure about the 32 bit PB app being able to use the API to find 64 bit processes. (thanks for clearing that doubt!).
Indeed Mailsession and Mapi wouldn't work, that's why I said that it works when using OLE.
The reason for my remarks is that Chris (with all respect), in other posts / Q&As - when it comes to pb 32 bit and outlook 64 - always answers that the PB app HAS to be also 64 bit. (and I always try to explain that that's not really true).
Regards,
MiguelL