出自:https://community.appeon.com/groups/powerbuilder/how-get-application-path
This example shows how to get the application path for development and deployment environments. This is compatible with PB 12.6.
I recommend to use a NVO to develop this functionality.
1. First declare the Local External Functions:
FUNCTION int GetModuleFileNameW(&
ulong hinstModule, &
REF string lpszPath, &
ulong cchPath) LIBRARY "KERNEL32.DLL"
FUNCTION ulong GetCurrentDirectoryW (&
ulong textlen, &
REF string dirtext) LIBRARY "KERNEL32.DLL"
2. And then create the function of_getapplicationpath():
ULong lul_rc, lul_size
LONG ll_last, ll_i, ll_handle
STRING ls_ApplicationPath = Space (255)
STRING ls_separator = "\"
//Get the handle of the application
ll_handle = Handle (GetApplication ())
//When handle is 0, it is in Development Environment.
IF ll_handle = 0 THEN
lul_rc = GetCurrentDirectoryW(255, ls_ApplicationPath)
Return ls_ApplicationPath
END IF
//When it is in Deployment Environment
GetModuleFileNameW(ll_Handle, ls_ApplicationPath, 254)
ll_i = 0
Do
ll_last = ll_i
ll_i = Pos (ls_ApplicationPath, ls_separator, ll_i + 1)
Loop Until ll_i = 0
Return Left (ls_ApplicationPath, ll_last - 1)
I hope it helps.
Resizing a Response Window or User Object
Here is a technique you can use to resize a response window or userobject as needed. It makes use of the GetWindowLong and SetWindowLong Windows API methods. The oldest reference I found to this is from Eric Aling back in 2000.
In a nutshell, you are changing the border around the object to one which Windows allows to be resized. What's even nicer about this is the standard resize events are triggered so you can reposition/change objects within the window as well (PFC resize service for example). From Eric's original post:
"The Get function retrieves the complete definition of the window in
a big long variable. All the bits in this long value describe the window.
So there are bits for the type of border (which indicates if a window is
resizable), menu, colors etc.etc. We can modify this long value, altering
the design of the window. Using the SetWindowLong() we update the window with
our specific modifications."
I used this in ancestor code of a userobject I use to create visible panels within the main window.
// Unicode declarations, used 'A' for ANSI
function long GetWindowLongW (long hWindow, integer nIndex) Library "user32.dll"
function long SetWindowLongW (long hWindow, integer nIndex, long dwNewLong) library "user32.dll"
// code in my post constructor event
n_cst_numerical lnv_num // PFC numeric service
long ll_Styles
boolean lb_Control
constant long WS_THICKFRAME = 262144
constant long WS_SYSMENU = 524288
ll_styles = GetWindowLongw(handle(THIS), -16)
if ll_styles <> 0 then
ll_styles = lnv_num.of_BitWiseOr(ll_styles, WS_THICKFRAME)
// don't need control menu but leave this for reference
// if ab_Control then
// ll_styles = lnv_num.of_BitWiseOr(ll_styles, WS_SYSMENU)
// end if
SetWindowLongW(handle(THIS), -16, ll_styles)
end if
At first my UO cannot be resized.
Now it can!
I've seen other references to these API calls for manipulating windows for other things but I have not investigated further.