Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DLL и командная строка. Создание DLL 
:(
    Опции темы
Guest_Андрей
  Дата 3.2.2003, 04:45 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Привет. Помогите создать DLL, которую можно выполнить в командной строке. Пример не помешает.
  Вверх
Vit
Дата 3.2.2003, 04:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



А кто её выполнять будет? У dll нет "точки входа", следовательно обычный запуск как EXE с DLL сделать нельзя, т.е. имеется ввиду что DLL будет запускать другая программа - ну так в чём проблема - пишешь любую DLL, а так же программу которая будет распознавать функции твоей DLL и ассоциируешь DLL с твоей программой. Ничего выходящего за рамки создания самой что ни на есть стандартной DLL и программы её вызова здесь нет. Если ты хочешь чтобы DLL запускалась какой-то определённой программой, то желательно бы указать какой, телепатов тут вроде как нет.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Guest_Андрей
Дата 3.2.2003, 06:44 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Скорее всего запуск с помощью Rundl32
  Вверх
[auxx]
Дата 3.2.2003, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 2.2.2003

Репутация: нет
Всего: нет



Вот, нашел в каком-то факе:

Вы должны определить в программе вызываемую снаружи функцию.
Функция должна быть __stdcall (или WINAPI, что то же самое ;)) и иметь
четыре аргумента. Первый - HWND окна, порождаемого rundll32 (можно использовать в качестве owner'а своих dialog box'ов), второй - HINSTANCE задачи, третий - остаток командной строки (LPCSTR, даже под NT), четвертый - не знаю ;). Hапример,
int __stdcall __declspec(dllexport) Test
(
HWND hWnd,
HINSTANCE hInstance,
LPCSTR lpCmdLine,
DWORD dummy

)
{
MessageBox(hWnd, lpCmdLine, "Command Line", MB_OK);
return 0;
}
===

rundll32 test.dll,_Test@16 this is a command line
===
выдаст message box со строкой "this is a command line".
PM MAIL   Вверх
Dapo
Дата 3.2.2003, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 18.4.2002

Репутация: нет
Всего: 1



Vit, как это у длл нет точки входа? А что такое DllEntryPoint?
PM MAIL   Вверх
[auxx]
Дата 3.2.2003, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 2.2.2003

Репутация: нет
Всего: нет



Цитата
Vit, как это у длл нет точки входа? А что такое DllEntryPoint?

Это разные вещи. Если я не ошибаюсь, DLLEntryPoint выполняется при загрузке ДЛЛ системой, но это самая обычная ф-ция, которой через стек передаются параметры (в отличие от ехе, там через регистры). DllEntryPoint возвратит значение, но после етого ДЛЛ ведь не выгружается (в отличие от ехе).
PM MAIL   Вверх
Unregistered
Дата 3.2.2003, 19:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Если не жалко и есть время, переведите этот код на Делфи, а то я с СИ не очень дружу.

Код
int __stdcall __declspec(dllexport) Test
(
HWND hWnd,
HINSTANCE hInstance,
LPCSTR lpCmdLine,
DWORD dummy

)
{
MessageBox(hWnd, lpCmdLine, "Command Line", MB_OK);
return 0;
}
===

rundll32 test.dll,_Test@16 this is a command line
===


  Вверх
stab
Дата 3.2.2003, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



DllEntryPoint вызавется в четырех случаях:

1. Загрузка в адресное пространство процеса.
2. Выгрузка из адресного пространства процеса.
3. При появлении новой нитки в процесе.
4. При удалении нитки из процеса.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
stab
Дата 3.2.2003, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



перевод:

function Test(hWnd, hInstance: Integer; lpCmdLine: PChar; dummy: Integer): Integer; stdcall;
begin
MessageBox(hWnd, lpCmdLine, "Command Line", MB_OK);
Result := 0;
end;

=======

rundll32 test.dll,Test this is a command line

Это сообщение отредактировал(а) cully - 3.2.2003, 21:06


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Guest_Андрей
Дата 4.2.2003, 21:25 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо.

А как привязать строку, прописанную в реестре:

C:\WINDOWS\rundll32.exe shell32.dll,Control_RunDLL %1,%*

...к запуску своего CPL файла?
  Вверх
Vit
Дата 5.2.2003, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Свой CPL файл будет запускаться без проблем без всяких изменений в реестре


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Guest_Андрей
Дата 6.2.2003, 00:32 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Мой CPL не хочет запускатся, если щелкнуть по нему правой кнопкой мышки и выбрать пункт "Открыть с помощью Панели Управления", а Майкрософтские аплеты запускаються.
  Вверх
Vit
Дата 6.2.2003, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Похоже что неправильно написан.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Guest_Андрей
Дата 6.2.2003, 21:56 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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

Код
function CPlApplet(CPlHandle: HWnd; uMsg: Word; AppletNo, lParam2: LongInt) : LongInt; stdcall;
var
 NewCPlInfo : PNewCPlInfo;
begin
 Result := 0;
 case uMsg of
   CPL_INIT:
   begin
     ModuleHandle := GetModuleHandle('Sredit.cpl');
     Result := LongInt(ModuleHandle <> INVALID_HANDLE_VALUE);
     //Result := 1;
   end;
   CPL_GETCOUNT: Result := 1;
   CPL_NEWINQUIRE:
   begin
     NewCPLInfo := PNewCPLInfo(lParam2);
     NewCplInfo^.Size := SizeOf(TNewCPlInfo);
     NewCPlInfo^.Flags := 0;
     NewCplInfo^.HelpContext := 0; // Context in you help file!
     NewCplInfo^.Data := 0;
     NewCplInfo^.Icon := LoadIcon(hInstance, MakeIntResource(2));
     lStrCpy(@PNewCplInfo(lParam2)^.Name, PChar(TextFromStringsResource(1)));
     lStrCpy(PNewCplInfo(lParam2)^.Info, PChar(TextFromStringsResource(2)));
     NewCPlInfo^.HelpFile := #0; // Path for your helpfile
   end;
   CPL_SELECT: Result := 0;
   CPL_DBLCLK:
     //Запуск диалогового окна
     DialogBoxParam(HInstance, MAKEINTRESOURCE(100), ModuleHandle, @DlgAboutFunc, ModuleHandle);
   CPL_STOP: Result := 0;
   CPL_EXIT: Result := 0;
   else Result := 0;
 end;
end;

exports
CPlApplet name 'CPlApplet';


  Вверх
Guest_Андрей
Дата 8.2.2003, 06:19 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Так что? Не знаемconfused.gif
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0768 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.