Форум » [x]Harbour » Как запуcкать приложения без использования __Run » Ответить

Как запуcкать приложения без использования __Run

SkyNET: Здравствуйте ! Подскажите пожалуйста, как можно запустить приложение не используя командную строку ?

Ответов - 72, стр: 1 2 3 4 All

Лукашевский: Andrey пишет: Ура, нашел на нашем языке...... Где нашёл? Поделись на aynn[at]li.ru

Andrey: Да не помню где взял... Давай адрес - вышлю ..

Лукашевский: Andrey пишет: Давай адрес - вышлю .. Так написан адрес-то! Или тебя [at] смутило?


Andrey: Лукашевский пишет: Или тебя [at] смутило? Смутило ! Это на каком языке ? aynn@li.ru - не прокатило !

Лукашевский: Andrey пишет: aynn@li.ru - не прокатило ! Очень странно... Сегодня мне отправляли письмо на этот ящик, я его получил. Может, ты чего не так пишешь? Смотри в uppercase: AYNN@LI.RU

Andrey: Файлы опубликованы: http://files.mail.ru/FCT0WW Файлы будут храниться до 10 июня 2009 года, каждое скачивание файлов продлевает их срок хранения еще на 5 дней.

Urri: Добрый день. Подскажите, а можно ли затормозить выполнение программы до того момента, пока то, что вызывалось ShellExecute, завершит свою работу?

Andrey: Один из вариантов: 1) Создать файл, любой хоть текстовый... (например exit.txt) 2) Вызвать ShellExecute() 3) Пока существует файл exit.txt программа не работает.... Можно повесить табличку типа: Работайте с программой такой-то... 4) А из программы вызываемой ShellExecute() удалите файл exit.txt 5) И переключите фокус на предыдущую программу.

Sergey Spirin: Подскажите, а можно ли затормозить выполнение программы до того момента, пока то, что вызывалось ShellExecute, завершит свою работу? На Delphi это делается следующим образом: function WinExec32AndWait(const Cmd: String; const CmdShow: Integer): Cardinal; var StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; begin Result := Cardinal($FFFFFFFF); FillChar(StartupInfo, SizeOf(TStartupInfo), #0); StartupInfo.cb := SizeOf(TStartupInfo); StartupInfo.dwFlags := STARTF_USESHOWWINDOW; StartupInfo.wShowWindow := CmdShow; if CreateProcess(nil, PChar(Cmd), nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then begin WaitForInputIdle(ProcessInfo.hProcess, Infinite); if WaitForSingleObject(ProcessInfo.hProcess, Infinite) = WAIT_OBJECT_0 then begin if not GetExitCodeProcess(ProcessInfo.hProcess, Result) then Result := Cardinal($FFFFFFFF); end; CloseHandle(ProcessInfo.hThread); CloseHandle(ProcessInfo.hProcess); end; end; Один в один переведите в С-синтаксис и все.

Urri: Не сложилась у меня дружба с Delphi, с С тоже не очень, так что спасибо за совет, которій мне не удастся воплотить в жизнь

Pasha: #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" HB_FUNC( EXECANDWAIT ) { char * szProg = hb_parc(1); int iShow = hb_parni(2); LONG lResult = -1; STARTUPINFO si; PROCESS_INFORMATION proc; memset( &si, 0, sizeof( si ) ); si.cb = sizeof( si ); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = iShow; if( CreateProcess(NULL, szProg, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &proc ) ) { WaitForInputIdle(proc.hProcess, INFINITE ); if( WaitForSingleObject( proc.hProcess, INFINITE ) == WAIT_OBJECT_0 ) { if( ! GetExitCodeProcess(proc.hProcess, (LPDWORD) &lResult ) ) lResult = -1; } CloseHandle(proc.hThread); CloseHandle(proc.hProcess); } hb_retnl( lResult ); } #pragma ENDDUMP Извини, не проверял (с)

Sergey Spirin: Urri пишет: так что спасибо за совет, которій мне не удастся воплотить в жизнь Pasha пишет: HB_FUNC( EXECANDWAIT ) { Ну, я надеялся, что с переводом вам помогут Паш, у меня, правда есть одно небольшое примечание: Тип Cardinal в дельфях это DWORD, поэтому, вообще говоря, $FFFFFFFF - это не -1, а 4294967295 К тому же в GetExitCodeProcess второй параметр идет указателем, поэтому, скорее всего, неявного приведения типов здесь не будет. То есть, результат может оказаться другим числом. Если я правильно понимаю LONG используется, потому что нельзя вернуть DWORD? Если так, то, может быть, несколько лучше будет так: Добавить еще переменную: DWORD dResult = 0хFFFFFFFF; В GetExitCodeProcess использовать ее: GetExitCodeProcess(proc.hProcess, (LPDWORD) &dResult ) ) Ну и перед возвратом - hb_retnl( lResult ); сделать явное присвоение: lResult = dResult;

Pasha: С учетом исправлений Сергея, функция будет выглядеть так: HB_FUNC( EXECANDWAIT ) { char * szProg = hb_parc(1); int iShow = hb_parni(2); DWORD dResult = 0хFFFFFFFF; LONG lResult; STARTUPINFO si; PROCESS_INFORMATION proc; memset( &si, 0, sizeof( si ) ); si.cb = sizeof( si ); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = iShow; if( CreateProcess(NULL, szProg, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &proc ) ) { WaitForInputIdle(proc.hProcess, INFINITE ); if( WaitForSingleObject( proc.hProcess, INFINITE ) == WAIT_OBJECT_0 ) { if( ! GetExitCodeProcess(proc.hProcess, (LPDWORD) &dResult ) ) dResult = 0хFFFFFFFF; } CloseHandle( proc.hThread ); CloseHandle( proc.hProcess ); } lResult = (LONG) dResult; hb_retnl( lResult ); } Заодно вопрос. Какой тэг использовать для кода, чтобы форум его не форматировал ?

Петр: Тип Cardinal в Pascal - это unsigned int или unsigned long в C или DWORD в терминологии Microsoft. Для того чтобы вернуть unsigned long необходимо использовать Harbour API функцию hb_retnint без всякого приведения и боязни получить неправильный результат. Pasha пишет: Заодно вопрос. Какой тэг использовать для кода, чтобы форум его не форматировал ? Я использую моношириннный шрифт + цитата

Sergey Spirin: Петр пишет: Для того чтобы вернуть unsigned long необходимо использовать Harbour API функцию hb_retnint без всякого приведения Ну, если можно вернуть ulong, то, конечно, его и надо возвращать Хотя, взглянув на объявление hb_retnint догадаться об этом трудно (возможно у меня старенькая версия харбура, и тем более я не С-шник). Например в hbapi.h: [pre2] extern HB_EXPORT void hb_retnl( long lNumber );/* returns a long number */ extern HB_EXPORT void hb_retnint( HB_LONG lNumber );/* returns a long number */ [/pre2] Как видим даже комменты одинаковые, а в определении HB_LONG: [pre2] typedef LONG HB_LONG;[/pre2] ?

Pasha: В харборе тип данных NUMERIC - только знаковый. Неважно, как описана переменная в С-коде, на уровне prg она будет всегда signed. Внутренний фомат при этом может быть разным: 16/32/64-битовое целое, или double

Петр: Sergey Spirin пишет: Как видим даже комменты одинаковые, а в определении HB_LONG: typedef LONG HB_LONG; О комментариях - без комментариев HB_LONG в зависимости от условий принимает значение [pre2]#if defined( HB_CLIPPER_INT_ITEMS ) .. typedef LONG HB_LONG; typedef ULONG HB_ULONG; .. #elif !defined( HB_LONG_LONG_OFF ) && ULONG_MAX == UINT_MAX .. typedef LONGLONG HB_LONG; typedef ULONGLONG HB_ULONG; #else .. typedef LONG HB_LONG; typedef ULONG HB_ULONG; .. #endif [/pre2] При сборке Harbour по умолчанию HB_LONG_LONG_OFF не используется (как и HB_CLIPPER_INT_ITEMS). Для С компиляторов под Win ULONG_MAX == UINT_MAX. К примеру, можно посмотреть для bcc (_lim.h) #define UINT_MAX ULONG_MAX /* maximum unsigned int value */ Т.е. HB_LONG - это не long или LONG, а LONGLONG. LONGLONG в зависимости от компилятора и платформы это signed long long или __int64 и может принимать значение от –9,223,372,036,854,775,808 до 9,223,372,036,854,775,807. Поэтому этот тип данных можно спокойно использовать для возврата данных из диапазона 0L - (ULONG) ~0L

Sergey Spirin: Петр пишет: HB_LONG в зависимости от условий принимает значение.... Ok Чтож, будем знать теперь, что int в названии функции не просто int, а целый Int64, да и HB_LONG не просто long, а по-long-ее будет

Dima: Pasha пишет: HB_FUNC( EXECANDWAIT ) что то не компилится по Harbour hbmk2: Compiling... obj\pew.c: Warning W8075 pew.prg 224: Suspicious pointer conversion in function HB_FUN_EXECANDWAIT Error E2206 pew.prg 226: Illegal character 'х' (0xe5) in function HB_FUN_EXECANDWAIT Error E2141 pew.prg 226: Declaration syntax error in function HB_FUN_EXECANDWAIT Error E2206 pew.prg 244: Illegal character 'х' (0xe5) in function HB_FUN_EXECANDWAIT Error E2379 pew.prg 244: Statement missing ; in function HB_FUN_EXECANDWAIT

Dima: ага , понял. в 0хFFFFFFFF буковка х русская в исходнике



полная версия страницы