Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2011, 22:15   #1
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию ShellExecute & WinExec кто кого?

В своей программе открываю страницу сайта через браузер по умолчанию. Соответственно для этого написана простенькая процедура:
Код:
procedure OpenURL(URL: AnsiString);
begin
 keybd_event(VK_SHIFT,0,0,0);
 ShellExecute(0,'open',PChar(URL),nil,nil,SW_SHOW);
 keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
end;
Как только делаю производится нажатие на кнопку потребление оперативной памяти возрастает на 800 Кб, посмотрел модуль ShellAPI, все эти процедуры библиотечные. Либо я о чём-то не знаю и надо как-то после завершения этой процедуры отключать используемую библиотеку (мб бред), либо попробывать использовать WinExec. Процедура тоже библиотечная, но из библиотеки kernel32, а на сколько я знаю эта библиотека используется приложением по умолчанию, следовательно потребление ресурсов не должно при этом повыситься.

Высказываем свои мнения по поводу данного сабжа.
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Старый 17.05.2011, 23:03   #2
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Цитата:
Высказываем свои мнения по поводу данного сабжа.
Учитывая что "хилинький конфиг" рядового пользователя на данный момент это минимум 2-ух ядерник + 1 Гиг оперативки + видяха на 512 Мб, то

Цитата:
потребление оперативной памяти возрастает на 800 Кб
вообще ниачём.

Цитата:
попробывать использовать WinExec
Нельзя этим

Цитата:
открываю страницу сайта через браузер
Сливочное масло Valio - компиляция как по маслу
Valio вне форума Ответить с цитированием
Старый 17.05.2011, 23:16   #3
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

Цитата:
Сообщение от Valio Посмотреть сообщение
Учитывая что "хилинький конфиг" рядового пользователя на данный момент это минимум 2-ух ядерник + 1 Гиг оперативки + видяха на 512 Мб
У меня одно ядро 2.2 ГГц, 1 Гб оперативки и видяха на 512 Мб, а где-то в шкафу стоит 2 пень. Я живу ещё тем временем, когда Дос рулил, а винты были в пределах нескольких метров, в связи с этим хотелось бы уважить самого себя, избавившись от "растрат" ресурсов.
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Старый 17.05.2011, 23:29   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
Сообщение от t2skler Посмотреть сообщение
В своей программе открываю страницу сайта через браузер по умолчанию. Соответственно для этого написана простенькая процедура:
Код:
procedure OpenURL(URL: AnsiString);
begin
 keybd_event(VK_SHIFT,0,0,0);
 ShellExecute(0,'open',PChar(URL),nil,nil,SW_SHOW);
 keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
end;
Как только делаю производится нажатие на кнопку потребление оперативной памяти возрастает на 800 Кб, посмотрел модуль ShellAPI, все эти процедуры библиотечные. Либо я о чём-то не знаю и надо как-то после завершения этой процедуры отключать используемую библиотеку (мб бред), либо попробывать использовать WinExec. Процедура тоже библиотечная, но из библиотеки kernel32, а на сколько я знаю эта библиотека используется приложением по умолчанию, следовательно потребление ресурсов не должно при этом повыситься.

Высказываем свои мнения по поводу данного сабжа.
Дай угадаю... выделение определял через Диспетчер задач? Ну он умеет приврать на n кб....

Независимо где находится процедура на её работу выделяется память...
Человек_Борща вне форума Ответить с цитированием
Старый 18.05.2011, 00:22   #5
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Дай угадаю... выделение определял через Диспетчер задач? Ну он умеет приврать на n кб....

Независимо где находится процедура на её работу выделяется память...
Так точно, смотрел через диспетчер. Но суть в том, что если процедура отрабатывает, то и используемая память должна очищаться. Да и подгрузка длл меня смущает. Всегда, когда я использовал библиотеки, потребляемые ресурсы повышалась.
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Старый 18.05.2011, 02:38   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Но суть в том, что если процедура отрабатывает, то и используемая память должна очищаться.
С чего бы это? Инициализацию on-demand никто не отменял.

Цитата:
либо попробывать использовать WinExec
WinExec - обёртка над CreateProcess. Она имеет лишь малюсенькую долю возможностей ShellExecute. Соответственно, никакого 'open' там быть не может. Всё придётся делать ручками.

Вообще, советую почитать: http://www.gunsmoker.ru/2011/04/windows-spin-off.html
Ерундой маетесь.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 18.05.2011, 14:44   #7
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
С чего бы это? Инициализацию on-demand никто не отменял.



WinExec - обёртка над CreateProcess. Она имеет лишь малюсенькую долю возможностей ShellExecute. Соответственно, никакого 'open' там быть не может. Всё придётся делать ручками.

Вообще, советую почитать: http://www.gunsmoker.ru/2011/04/windows-spin-off.html
Ерундой маетесь.
Спасибо огромное за статью, но по-моему в моём случае выделяется физическая память, а не виртуальная. Виртуальную я постоянно очищаю из самого приложения.
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Старый 18.05.2011, 15:38   #8
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,451
По умолчанию


//Запуск файла
ShellExecute(Handle, nil, 'c:\windows\calc.exe', nil, nil, SW_SHOW);

//Просмотр каталога
ShellExecute(Handle, nil, 'c:\windows', nil, nil, SW_SHOW);

//Ссылка на сайт
ShellExecute(Handle, nil, 'http://www.site.ru', nil, nil, SW_SHOW);

//Послать E-mail
ShellExecute(Handle, nil, 'mailto:DelphiWorld@mail.ru', nil, nil, SW_SHOW);

//автозаполнения формы для нового письма в почтовой программе установленной по умолчанию
ShellExecute(Handle,'Open','mailto:vit@vingrad. ru?subject=Regardingyouradvice&Body =First%20Line%0D%0ASed %20line&CC=somebodyelse@vingrad.ru' ,nil, nil, sw_restore);

//открыть CHM справку на нужной странице (установить фокус на нужной странице CHM справки)
ShellExecute( Handle, 'open', 'C:\WINDOWS\hh.exe', 'D:\AIMP2.chm::/bookmarks.html', nil,SW_SHOWNORMAL);

//Открыть каталог с этим файлом и установить фокус на этот файл (выделить файл в открытом каталоге)
ShellExecute(Handle,'open','explorer',PChar('/select,'+PChar('C:\WINDOWS\system32 \mspaint.exe')),'',SW_SHOWNORMAL);

в прикрепленном файле модуль ShellExecuteUnit v.1.50 beta (Delph)

В модуле описаны нужные константы и коды ошибок для ф-ции ShellExecute().
Сама функция импортируется из системной dll-ки. В принципе в этом нет
необходимости - можно использовать подключение стандартных модулей Windows
и ShellApi в секции uses. Сделано это для того, чтобы все было "перед
глазами", включая информацию из документации. Кроме того, в модуль входит
функция для анализа ошибок.
Вложения
Тип файла: rar ShellExecuteUnit v.1.50 beta (Delph).rar (6.7 Кб, 23 просмотров)

Последний раз редактировалось beegl; 18.05.2011 в 16:24. Причина: исправление, прикрепил файл
beegl вне форума Ответить с цитированием
Старый 18.05.2011, 17:30   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

А вообще добавлю что память выделяется не только для одной вызываемой вами функции/процедуры но и последующий функци/процедур которые вызываются вашей функцией/процедурой. Вот так растёт память..

А если вы вызвааете что-то из dll то ещё выделяется память для этой dll(т.к. эти штуки нельзя загружать на половину). Ну кусок exe ведь не запустишь?
Если это что-то надо вызввать один раз за всю жизн юазем динамический вызов функций из dll(Загрузили, получили,выполнили,выгрузили).

А для определения всего и вся процесса используйте Process Explorer от Марка Руссиновича
Человек_Борща вне форума Ответить с цитированием
Старый 18.05.2011, 17:38   #10
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
А вообще добавлю что память выделяется не только для одной вызываемой вами функции/процедуры но и последующий функци/процедур которые вызываются вашей функцией/процедурой. Вот так растёт память..

А если вы вызвааете что-то из dll то ещё выделяется память для этой dll(т.к. эти штуки нельзя загружать на половину). Ну кусок exe ведь не запустишь?
Если это что-то надо вызввать один раз за всю жизн юазем динамический вызов функций из dll(Загрузили, получили,выполнили,выгрузили).

А для определения всего и вся процесса используйте Process Explorer от Марка Руссиновича
Ну или аналог этой программы AnVir Task Manager. Отображает подгруженные библиотеки и используемые файлы, а также все потоки и даже соединения.
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Winexec и string в DELPHI D][mon Помощь студентам 0 22.10.2010 23:54
TForm & TImage & PNG & Прозрачность delphi_beginner Общие вопросы Delphi 7 19.09.2009 08:46
Евровидение 2009 - кто кого? Hallo Свободное общение 22 17.05.2009 16:09
Нужен кто-нибудь, кто сможет подсказать, как подступиться к программированию Delphi & C++ Koshka_Kali Помощь студентам 2 30.11.2008 13:23
WinExec Volkogriz Общие вопросы Delphi 1 25.11.2008 11:07