Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PowerBuilder Новый топик    Ответить
 Как блокировать Builder  [new]
proba_new
Member

Откуда:
Сообщений: 15
Добрый день. Подскажите как лучше сделать.

Запускаю программу ( exe - шник ) через OLE:
.........
wsh = CREATE OleObject
ll_rc = wsh.ConnectToNewObject( "WScript.Shell" )
........
ll_rc = wsh.Run( ls_File , MINIMIZED, WAIT)
wsh.DisconnectObject()

После завершения exe-шника идет обработка результата выполнения.
Время исполнения exe-шника занимает несколько секунд, но
шаловливый пользователь может успеть закрыть окно, откуда
все вызывалось.. Можно ли заблокировать
Builder каким-нибудь глобальным способом или обязательно необходимо
прописывать неактивность каждого элемента.

Спасибо, proba_new
3 фев 05, 12:44    [1296951]     Ответить | Цитировать Сообщить модератору
 Re: Как блокировать Builder  [new]
hurr
Member

Откуда:
Сообщений: 85
Оно ?

$PBExportHeader$uo_syncproc.sru
$PBExportComments$Object fot execute a DOS program and have the PB code wait until the program completes
forward
global type uo_syncproc from nonvisualobject
end type
end forward

type os_process_information from structure
unsignedlong ul_process
unsignedlong ul_thread
unsignedlong ul_processid
unsignedlong ul_threadid
end type

type os_startupinfo from structure
ulong ul_cb
string s_reserved
string s_desktop
string s_title
ulong ul_x
ulong ul_y
ulong ul_xsize
ulong ul_ysize
ulong ul_xcountchars
ulong ul_ycountchars
ulong ul_fillattribute
ulong ul_flags
uint ui_showwindow
uint ui_reserved2
long l_reserved2
ulong ul_stdinput
ulong ul_stdoutput
ulong ulstderror
end type

global type uo_syncproc from nonvisualobject
end type
global uo_syncproc uo_syncproc

type prototypes
private:
function ulong WaitForSingleObject(ulong handle, ulong milliseconds) library "kernel32.dll"
function boolean CreateProcess(ulong applicationname, string commandline, ulong processattributes, ulong threadattributes, boolean inherithandles, ulong creationflags, ulong environment, string currentdirectory, ref os_startupinfo startupinf, ref os_process_information processinformation) library "kernel32.dll" alias for CreateProcessA
function boolean CloseHandle(ulong object) library "kernel32.dll"
function ulong GetLastError() library "kernel32.dll"
function boolean TerminateProcess(ulong handle, uint exitcode) library "kernel32.dll"

end prototypes

type variables
public:
constant ulong INFINITE = 4294967295
constant ulong NORMAL_PRIORITY_CLASS = 32
constant ulong IDLE_PRIORITY_CLASS = 64
constant ulong HIGH_PRIORITY_CLASS = 128
constant ulong REALTIME_PRIORITY_CLASS = 256
private:
constant ulong STARTF_USESHOWWINDOW = 1
constant ulong STARTF_USESIZE = 2
constant ulong STARTF_USEPOSITION = 4
constant uint SW_HIDE = 0
constant uint SW_NORMAL = 1
constant uint SW_MAXIMIZE = 3
constant uint SW_MINIMIZE = 6
constant ulong WAIT_FAILED = 4294967295
constant ulong WAIT_TIMEOUT = 258
constant double LOG_2 = log(2)
os_startupinfo istr_startupinfo
ulong iul_creationflags = NORMAL_PRIORITY_CLASS
ulong iul_timeout = INFINITE
string is_directory
end variables

forward prototypes
public function integer of_setpriority (unsignedlong aul_priority)
public function integer of_setcurrentdirectory (string as_directory)
public function boolean of_isenabled (unsignedlong aul_feature)
public function integer of_setposition (unsignedlong aul_x, unsignedlong aul_y)
public function integer of_setsize (unsignedlong aul_width, unsignedlong aul_height)
public function integer of_setwindow (string as_windowstate)
public function integer of_runandwait (readonly string as_command)
public function integer of_settimeout (decimal adec_seconds)
end prototypes

public function integer of_setpriority (unsignedlong aul_priority);IF IsNull(aul_priority) THEN RETURN -1

IF aul_priority <> NORMAL_PRIORITY_CLASS OR &
aul_priority <> REALTIME_PRIORITY_CLASS OR &
aul_priority <> HIGH_PRIORITY_CLASS OR &
aul_priority <> IDLE_PRIORITY_CLASS THEN &
RETURN -1

THIS.iul_CreationFlags = aul_priority

RETURN 1
end function

public function integer of_setcurrentdirectory (string as_directory);IF Len(as_directory) = 0 THEN SetNull(as_directory)
THIS.is_directory = as_directory

RETURN 1
end function

public function boolean of_isenabled (unsignedlong aul_feature);IF Int(Mod(THIS.istr_startupinfo.ul_flags / ( 2 ^ ( Log( aul_feature ) / LOG_2 ) ), 2 ) ) > 0 THEN
RETURN TRUE
ELSE
RETURN FALSE
END IF
end function

public function integer of_setposition (unsignedlong aul_x, unsignedlong aul_y);IF IsNull(aul_x ) or IsNull( aul_y ) THEN RETURN -1

IF aul_x = 0 and aul_y = 0 THEN
IF THIS.of_IsEnabled(STARTF_USEPOSITION) THEN
THIS.istr_startupinfo.ul_flags -= STARTF_USEPOSITION
END IF
ELSE
IF NOT THIS.of_IsEnabled(STARTF_USEPOSITION) THEN
THIS.istr_startupinfo.ul_flags += STARTF_USEPOSITION
END IF
THIS.istr_startupinfo.ul_x = aul_x
THIS.istr_startupinfo.ul_y = aul_y
END IF

RETURN 1
end function

public function integer of_setsize (unsignedlong aul_width, unsignedlong aul_height);IF IsNull( aul_width ) or IsNull( aul_height ) THEN RETURN -1
IF aul_width = 0 and aul_height = 0 THEN
IF THIS.of_IsEnabled( STARTF_USESIZE ) THEN
THIS.istr_startupinfo.ul_flags -= STARTF_USESIZE
END IF
ELSE
IF NOT THIS.of_IsEnabled( STARTF_USESIZE ) THEN
THIS.istr_startupinfo.ul_flags += STARTF_USESIZE
END IF
THIS.istr_startupinfo.ul_xsize = aul_width
THIS.istr_startupinfo.ul_ysize = aul_height
END IF

RETURN 1
end function

public function integer of_setwindow (string as_windowstate);integer li_return = 1

IF NOT THIS.of_IsEnabled ( STARTF_USESHOWWINDOW ) THEN
THIS.istr_startupinfo.ul_flags += STARTF_USESHOWWINDOW
END IF

CHOOSE CASE Lower( as_windowstate )
CASE "off"
THIS.istr_startupinfo.ul_flags -= STARTF_USESHOWWINDOW
CASE 'normal'
THIS.istr_startupinfo.ui_showwindow = SW_NORMAL
CASE 'maximize'
THIS.istr_startupinfo.ui_showwindow = SW_MAXIMIZE
CASE "minimize"
THIS.istr_startupinfo.ui_showwindow = SW_MINIMIZE
CASE 'hide'
THIS.istr_startupinfo.ui_showwindow = SW_HIDE
CASE ELSE
li_return = -1
END CHOOSE

RETURN li_return

end function

public function integer of_runandwait (readonly string as_command);os_process_information lstr_proc
boolean lb_rc
integer li_return = -1
ulong lul_rc
ulong lul_null

SetNull( lul_null )

//Set Size of structure. There are 13 long and 2 integer values, plus three strings.
THIS.istr_startupinfo.ul_cb = ( 13 * 4 ) + ( 2 * 2 ) + &
Len( THIS.istr_startupinfo.s_reserved ) + &
Len( THIS.istr_startupinfo.s_desktop ) + &
Len( THIS.istr_startupinfo.s_title )

lb_rc = CreateProcess( lul_null, as_command, lul_null, lul_null, true, &
THIS.iul_CreationFlags, lul_null, THIS.is_directory, &
THIS.istr_startupinfo, lstr_proc)

IF lb_rc THEN
lul_rc = WaitForSingleObject( lstr_proc.ul_process, THIS.iul_timeout)
CHOOSE CASE lul_rc
CASE WAIT_TIMEOUT
TerminateProcess( lstr_proc.ul_process, 0 )
CASE WAIT_FAILED
lul_rc = GetLastError()
MessageBox( 'Wait Failed', lul_rc )
END CHOOSE
ELSE
lul_rc = GetLastError()
MessageBox( 'Create Process Failed', lul_rc )
END IF

lb_rc = CloseHandle( lstr_proc.ul_process )

IF lb_rc THEN li_return = 1


RETURN li_return

end function

public function integer of_settimeout (decimal adec_seconds);IF IsNull( adec_seconds ) THEN RETURN -1
IF adec_seconds < -1 THEN RETURN -1
IF adec_seconds = INFINITE THEN
THIS.iul_timeout = INFINITE
ELSE
THIS.iul_timeout = adec_seconds * 1000
END IF

RETURN 1
end function

on uo_syncproc.create
TriggerEvent( this, "constructor" )
end on

on uo_syncproc.destroy
TriggerEvent( this, "destructor" )
end on

event constructor;//Initialize unused values according to SDK help file
/*Using the sample pbl and the below code, you can execute a DOS program and have the PB code wait until the program completes. Under normal condifions, the code will continue before the DOS program completes

example :
uo_syncproc luo_sync
luo_sync = CREATE uo_syncproc
luo_sync.of_setwindow('minimize')
luo_sync.of_RunAndWait('notepad.exe')
DESTROY luo_sync
*/
SetNull(THIS.istr_startupinfo.s_reserved)
SetNull(THIS.istr_startupinfo.s_title)
SetNull(THIS.istr_startupinfo.l_reserved2)
THIS.istr_startupinfo.ui_reserved2 = 0

//Initialize instance variables
SetNull(THIS.is_directory)
end event


Ну а в проге :

uo_syncproc run_app
run_app = CREATE uo_syncproc
run_app.of_runandwait( "C:\Progra~~1\WinRAR\WinRAR.exe" )
3 фев 05, 15:38    [1297846]     Ответить | Цитировать Сообщить модератору
 Re: Как блокировать Builder  [new]
proba_new
Member

Откуда:
Сообщений: 15
Оно, спасибо.
5 фев 05, 18:55    [1302500]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как блокировать Builder  [new]
Riska
Member

Откуда: Израиль
Сообщений: 989
У кого-нибудь эта штука работает в РВ11.0?
uo_syncproc luo_sync
luo_sync = CREATE uo_syncproc
luo_sync.of_setwindow('minimize')
luo_sync.of_RunAndWait('notepad.exe')
DESTROY luo_sync 
1 май 11, 16:42    [10592470]     Ответить | Цитировать Сообщить модератору
 Re: Как блокировать Builder  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
Riska
У кого-нибудь эта штука работает в РВ11.0?

Наверное надо там определения функций для юникода поправить?
2 май 11, 13:44    [10594693]     Ответить | Цитировать Сообщить модератору
Все форумы / PowerBuilder Ответить