Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DllProc [D6, Win2k, WinXP]


SeF ©   (2003-01-13 11:19:00) 

Грузится системным загрузчиком в АП запускаемого учу
моя Dll a dllproc не вызывается... как бороться???
гружу через "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs"


SeF   (2003-01-15 14:01:00) [1]

Выложил...


SeF   (2003-01-15 14:00:00) [2]

забыл выложить :)


paul_shmakov   (2003-01-15 03:01:00) [3]

эта, картинки - 404 :)


SeF   (2003-01-14 22:23:00) [4]


> paul_shmakov © (14.01.03 12:35)

оба теста на ура, без ошибок.

но с моей библиотекой:
1 http://seff.pisem.net/1.jpgсообщение об ошибке;
2 http://seff.pisem.net/2.jpgEventLog;

ps если библиотека грузится в прогрпмму написаную не на delphi то все ok.
код библиотеки:


...
var th:MyThread;

procedure run_;
begin
th:=MyThread.Create(false);
th.FreeOnTerminate:=true;
end;

procedure dllentry(reason:integer);
begin
case reason of
DLL_PROCESS_DETACH:th.Terminate;
DLL_PROCESS_ATTACH:run_;
DLL_THREAD_ATTACH:exit;
DLL_THREAD_DETACH:exit;
end;
end;

begin
dllproc:=@dllentry;
DLLEntry (DLL_PROCESS_ATTACH);
end.

execute потока:

procedure MyThread.Execute;
begin
while not Terminated do
begin
sleep(1000);
beep;
end;
end;


paul_shmakov   (2003-01-14 12:47:00) [5]

теперь второй тест - на статическое подключение. опять два файла. сделать нужно все тоже самое, только теперь в DebugView дожно быть три записи: DLL_PROCESS_ATTACH, func и DLL_PROCESS_DETACH.


// test2.dpr
// compile with dcc32 test2.dpr
library test2;

uses Windows;

procedure func;
begin
OutputDebugString("func"#13#10);
end;

procedure DLLEntryPoint(Reason: Integer);
begin
case Reason of
DLL_PROCESS_ATTACH: OutputDebugString("DLL_PROCESS_ATTACH"#13#10);
DLL_THREAD_ATTACH: OutputDebugString("DLL_THREAD_ATTACH"#13#10);
DLL_THREAD_DETACH: OutputDebugString("DLL_THREAD_DETACH"#13#10);
DLL_PROCESS_DETACH: OutputDebugString("DLL_PROCESS_DETACH"#13#10);
end;
end;

exports func;

begin
DLLProc := @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.



// loader2.dpr
// compile with dcc32 loader2.dpr
program loader2;

{$APPTYPE CONSOLE}

uses Windows;

procedure func; external "test2.dll";

begin
func;
end.


paul_shmakov   (2003-01-14 12:35:00) [6]

ok, тестируем. вам нужен DebugView от Марка Руссиновича (www.sysinternals.com).

скомпилируйте слудующие два файла и запустите loader.exe. если в DebugView будет после этого две записи (DLL_PROCESS_ATTACH и DLL_PROCESS_DETACH), то все у вас нормально.

первый файл. это dll.

// test.dpr
// compile with dcc32 test.dpr
library test;

uses Windows;

procedure DLLEntryPoint(Reason: Integer);
begin
case Reason of
DLL_PROCESS_ATTACH: OutputDebugString("DLL_PROCESS_ATTACH"#13#10);
DLL_THREAD_ATTACH: OutputDebugString("DLL_THREAD_ATTACH"#13#10);
DLL_THREAD_DETACH: OutputDebugString("DLL_THREAD_DETACH"#13#10);
DLL_PROCESS_DETACH: OutputDebugString("DLL_PROCESS_DETACH"#13#10);
end;
end;

begin
DLLProc := @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.


второй файл. loader.exe

// loader.dpr
// compile with dcc32 loader.dpr
program loader;

{$APPTYPE CONSOLE}

uses Windows;

begin
FreeLibrary(LoadLibrary("test.dll"));
end.


SeF   (2003-01-13 23:38:00) [7]

помогло, но не совсем. т.е. если делаю просто LoadLibrary то все ok, но если ее загружает система то выдается ошибка.

P.S. по DLL_PROCESS_ATTACH просто создается поток в котором в цикле Beep.


SeF   (2003-01-13 22:00:00) [8]

попробую...


paul_shmakov   (2003-01-13 16:29:00) [9]

скорее всего у вас delphi 6 без второго сервиспака - я как-то долго возился с этой проблемой в чужой dll, пока не обнаружил ошибку в процедуре _StartLib в system.pas.
второй сервиспак это исправляет.


Наверх

Титульная страница Поиск, карта сайта Написать письмо