Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
 Аватар для Надя Кармин
-8 / 0 / 0
Регистрация: 07.12.2017
Сообщений: 123

Как заставить rundll32 выполнять DLL-библиотеку, продолжительное время?

15.07.2019, 23:35. Показов 4155. Ответов 24

Студворк — интернет-сервис помощи студентам
Суть проблемы такова: я создаю dll-библиотеку и запускаю ее через rundll32.exe. Проблема в том, что в отличие от программы специально писанной под библиотеку, rundll по быстрому запускает библиотеку, а затем вырубается вместе с ней, через какую-то секунду. Так что используемые в библиотеке компоненты, попросту не успевают сработать и выполнить то что от них требуется. Как бы мне "заклинить" rundll, чтобы он висел в памяти и обеспечивал работу моей библиотеки столько, сколько мне нужно?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.07.2019, 23:35
Ответы с готовыми решениями:

Как заставить программу выполнять какое-то действие в нужное время?
Как заставить программу выполнять какое-то действие в нужное время например в 17:00 не учитывая даты?

Как загрузить картинку и оставить ее на продолжительное время в памяти?
Как загрузить картинку и оставить ее на продолжительное время т е чтобы она не запрашивалась из фаиловой системы каждый раз ? при...

Как запустить мою DLL через rundll32?
Как запустить библиотеку при помощи rundll32? rundll - на сколько я понял, отображает форму. Тогда в библиотеке придется...

24
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
16.07.2019, 00:55
Что именно вы подразумеваете под "запускает библиотеку"?
Зачем вообще делать "запускаю dll-библиотеку через rundll32.exe"?
Когда весь код функции из dll выполнится - разумеется всё выгружается. Не выходите из неё, пока не всё сделали.
1
пофигист широкого профиля
4770 / 3205 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
16.07.2019, 02:02
Цитата Сообщение от GoodWeather Посмотреть сообщение
Зачем вообще делать "запускаю dll-библиотеку через rundll32.exe"?
Я тоже хотел бы это узнать.
0
 Аватар для Надя Кармин
-8 / 0 / 0
Регистрация: 07.12.2017
Сообщений: 123
16.07.2019, 02:23  [ТС]
Цитата Сообщение от GoodWeather Посмотреть сообщение
Когда весь код функции из dll выполнится - разумеется всё выгружается. Не выходите из неё, пока не всё сделали.
А я и не выхожу. Rundll сам вырубается.
0
Модератор
4146 / 2357 / 812
Регистрация: 15.11.2015
Сообщений: 9,434
16.07.2019, 04:48
Цитата Сообщение от Надя Кармин Посмотреть сообщение
А я и не выхожу.
А где код?
0
 Аватар для Надя Кармин
-8 / 0 / 0
Регистрация: 07.12.2017
Сообщений: 123
16.07.2019, 21:42  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
А где код?
Стандартный dll-код.
Вот он:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
library TestDLL;
 
{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }
 
uses
  System.SysUtils,
  Vcl.Forms,
  System.Classes,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Frame2: TFrame};
 
{$R *.res}
var
TF : TForm1;
procedure StartForm;
begin
TF := TForm1.Create(Application);
TF.Show;
end;
exports
StartForm;
 
begin
end.
Легче стало?
0
Модератор
4146 / 2357 / 812
Регистрация: 15.11.2015
Сообщений: 9,434
16.07.2019, 22:48
Цитата Сообщение от Надя Кармин Посмотреть сообщение
Легче стало?
Конечно. Говорят, вызываемая функция должна быть определённым образом объявлена, так как, ей передаются несколько параметров.

Добавлено через 2 минуты
http://datadump.ru/rundll32/

Пример использования rundll32

Для запуска программы rundll32 используется синтаксис командной строки следующего вида:

rundll32.exe <имя_библиотеки_dll>, <необязательные_параметры_функции>

В качестве примера предлагаю разобрать команду запуска апплета "Язык и региональные стандарты" панели управления, вкладка "Форматы":

rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,0

При выполнении данной команды утилита rundll32 вызовет функцию Control_RunDLL(), находящуюся в библиотеке shell32.dll, и передаст ей следующие параметры:
Параметр Описание
hWnd Идентификатор (дескриптор) родительского окна, который обычно используется при создании окон в функциях загружаемой библиотеки DLL.
hInstance Дескриптор (заголовок экземпляра) выбранной библиотеки DLL. Иначе, стартовый адрес процесса DLL в адресном пространстве. В нашем случае - библиотеки shell32.dll.
lpCmdLine Командная строка, передаваемая библиотеке. То есть параметры, передаваемые самой библиотеке. В нашем случае "intl.cpl,,0";
nCmdShow Режим отображения окон выбранной библиотеки. (данные, передаваемые функции CreateProcess).

Добавлено через 26 минут
Вот это заработало:
Delphi
1
2
3
4
5
6
procedure StartForm;
begin
  TF := TForm1.Create(nil);
  TF.ShowModal;
  TF.Destroy;
end;
Добавлено через 47 секунд
Нужен цикл обработки сообщений. ShowModal его обеспечивает. Без цикла будет сразу закрываться.
0
 Аватар для Надя Кармин
-8 / 0 / 0
Регистрация: 07.12.2017
Сообщений: 123
16.07.2019, 22:56  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
Нужен цикл обработки сообщений. ShowModal его обеспечивает. Без цикла будет сразу закрываться.
Блин, и как же я сама до ShowModal не додумалась?! Вот только мне данный метод не подходит, так как на форме показываемой таким способом, компоненты как надо не работают.
Алсо, простыня текста, которую вы привели выше, мне также знакома.
0
Модератор
4146 / 2357 / 812
Регистрация: 15.11.2015
Сообщений: 9,434
16.07.2019, 23:02
Какие компоненты не работают в ShowModal?
0
 Аватар для Надя Кармин
-8 / 0 / 0
Регистрация: 07.12.2017
Сообщений: 123
16.07.2019, 23:18  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
Какие компоненты не работают в ShowModal?
Никакие. Когда я запускаю библиотеку не через rundll и без ShowModal - все работает нормально.
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
17.07.2019, 00:53
Цитата Сообщение от Надя Кармин Посмотреть сообщение
Стандартный dll-код.
Это не "стандартный код", это пустой шаблон DLL, в который вы что-то дописали.

Добавлено через 23 секунды
Зато вот это "стандартный код" VCL-приложения:
Delphi
1
2
3
Application.Initialize();
... // Creating Forms
Application.Run();
Где же вы сие делаете?

Добавлено через 1 минуту
Логика вашей функции StartForm из #6:
  1. Создать форму.
  2. Показать форму.
  3. Всё сделано, завершаем работу.

Добавлено через 1 минуту
Разумеется оно сразу завершается - вы не выполняете цикла обработки сообщений, а сразу выходите из вашей функции.

Добавлено через 2 минуты
VCL-приложение запускается по Application.Run();, где Application - глобальная переменная из модуля Vcl.Forms.
0
пофигист широкого профиля
4770 / 3205 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
17.07.2019, 02:17
Цитата Сообщение от Надя Кармин Посмотреть сообщение
Никакие. Когда я запускаю библиотеку не через rundll и без ShowModal - все работает нормально.
Вы бы перестали секретничать и сказали бы что вам в конечном итоге нужно.
Запускать такую Дельфийскую библиотеку с помощью rundll это чушь. Стандартная утилита Windows не знает ничего да и не должна знать ничего про Дельфи.
0
17.07.2019, 04:46

Не по теме:

Цитата Сообщение от Надя Кармин Посмотреть сообщение
Блин, и как же я сама до ShowModal не додумалась?! Вот только мне данный метод не подходит, так как на форме показываемой таким способом, компоненты как надо не работают.
Алсо, простыня текста, которую вы привели выше, мне также знакома.
Вижу, ваша манера общения все также умещается в парадигму "Помогите разобраться, идиоты"... Некоторые вещи неизменны под Луной.

0
Модератор
4146 / 2357 / 812
Регистрация: 15.11.2015
Сообщений: 9,434
17.07.2019, 09:26
Цитата Сообщение от Надя Кармин Посмотреть сообщение
Блин, и как же я сама до ShowModal не додумалась?!
Сначала надо додуматься почитать, как работают программы под windows, почему окно не закрывается.

Алсо, окно при первоначальном коде всё же открывается и тут же закрывается. Почему - станет ясно, если почитать про построение приложения под windows.

Сделай сначала приложение, используя только Win API, то есть, без всяких VCL.

Цитата Сообщение от Надя Кармин Посмотреть сообщение
Никакие.
Невероятно. У меня в D7 работают все, которые я накидал на форму.
0
 Аватар для Надя Кармин
-8 / 0 / 0
Регистрация: 07.12.2017
Сообщений: 123
18.07.2019, 00:18  [ТС]
Цитата Сообщение от GoodWeather Посмотреть сообщение
Это не "стандартный код", это пустой шаблон DLL, в который вы что-то дописали.
Я и говорю - стандартный код.
Цитата Сообщение от GoodWeather Посмотреть сообщение
Зато вот это "стандартный код" VCL-приложения:
DelphiВыделить код
1
2
3
Application.Initialize();
... // Creating Forms
Application.Run();
Где же вы сие делаете?
Простите, немного не въехала. Зачем именно это нужно делать? Нельзя ли более развернуто пояснить, что вы имеете в виду?
Цитата Сообщение от GoodWeather Посмотреть сообщение
Логика вашей функции StartForm из #6:
Создать форму.
Показать форму.
Всё сделано, завершаем работу.
Добавлено через 1 минуту
Разумеется оно сразу завершается - вы не выполняете цикла обработки сообщений, а сразу выходите из вашей функции.
Нельзя ли конкретнее? Что за цикл?

Добавлено через 3 минуты
Цитата Сообщение от AzAtom Посмотреть сообщение
Сначала надо додуматься почитать, как работают программы под windows, почему окно не закрывается.
Алсо, окно при первоначальном коде всё же открывается и тут же закрывается. Почему - станет ясно, если почитать про построение приложения под windows.
И что именно мне читать?

Добавлено через 11 минут
P.S. Только что, попробовала вот эту конструкцию:
Delphi
1
2
3
4
Application.Initialize();
TF := TForm1.Create(Application);
TF.Show;
Application.Run;
Все тот же результат, форма появляется на экране на секунду, а затем rundll вырубается.
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
18.07.2019, 00:39
Окна на чистом WinAPI. Или просто о сложном.
Цикл обработки сообщений.

Добавлено через 20 секунд
Delphi
1
2
3
4
5
6
7
Procedure StartApp(); // а не StartForm();
Begin
Application.Initialize();
Application.CreateForm(TForm1, TF);
// TF.Show; // Не требуется.
Application.Run();
End;
1
 Аватар для Надя Кармин
-8 / 0 / 0
Регистрация: 07.12.2017
Сообщений: 123
18.07.2019, 01:06  [ТС]
Цитата Сообщение от GoodWeather Посмотреть сообщение
Procedure StartApp(); // а не StartForm();
Begin
Application.Initialize();
Application.CreateForm(TForm1, TF);
// TF.Show; // Не требуется.
Application.Run();
End;
Попробовала. Окно все также появляется лишь на секунду и пропадает.
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
18.07.2019, 10:41
Цитата Сообщение от Надя Кармин Посмотреть сообщение
Суть проблемы такова: я создаю dll-библиотеку и запускаю ее через rundll32.exe.
А суть проблемы и не ясна. То есть, у тебя есть рабочее приложение и библиотека. Ты из рабочего приложения вызываешь rundll, которая загружает библиотеку, так что ли? а почему бы не вызвать библиотеку сразу из рабочего приложения?
и пока не будет внятного ответа на последний вопрос, никто тебе не поможет
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
18.07.2019, 12:01
Скорее всего из консоли или батника. Но до сих пор непонятно - зачем так делать?
И в #16 всё работает.
0
пофигист широкого профиля
4770 / 3205 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
19.07.2019, 02:30
Надя Кармин, может всё же озвучите конечную задачу? Ну сколько можно болтать ерундой?
Ну на хрена/с какого перепуга вам понадобилось "запускать" что-то из DLL собранной на Дельфи именно с помощью RunDll?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.07.2019, 02:30
Помогаю со студенческими работами здесь

Продолжительное время появляются бсоды
Всем здравствуйте. Уже довольно долгое время на ПК появляются бсоды, а звук в наушниках начинает трещать. В основном, жалобы на...

Как заставить кнопки выполнять разные функции?
&lt;p&gt;Ведите длинну массива :&lt;/p&gt; &lt;form method=&quot;GET&quot; action=&quot;zachet.php&quot;&gt; &lt;p&gt;ДЛИННА МАССИВА = &lt;input type=&quot;text&quot;...

Окраска DataGridView занимает довольно продолжительное время
Задача выводить пользователю окрашенный с условиями грид. Загрузка данных в грид происходит быстро а вот окраска его очень медленная. ...

Возможно ли написать библиотеку dll, которая будет открывать окно браузера во время игры?
Возможно ли написать на Delphi библиотеку dll, которая будет открывать окно браузера во время игры?

Духовой шкаф Ariston, FD88C выключается через продолжительное время
Добрый день! S/n 207170348 03222810100 Обратился клиент: 1) Не работал селектор температуры. Был жестоко выдран из платы....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru