· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› DLL_PROCESS_ATTACH

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Ноя 21, 2003 23:49:35

Вопрос в следующем, здесь между .IF/.ENDIF может быть любой
код или есть какие-то ограничения, например, DialogBoxParam
здесь можно вызвать??
.if reason==DLL_PROCESS_ATTACH
   ......................
.endif


Дата: Ноя 22, 2003 00:08:28

А почему нет? Это же просто инициализация - Win вызвыает вашу процедуру после загрузки DLL, значит ресурсы есть, все остальное тоже, я вообще не вижу отличий DllMain от любой другой ф-ии в DLL, разве что это единственная ф-я, которую обязательно вызовут... мой ламерский опыт свидетельствует - можно делать все что хочешь... пока не пнут :)


Дата: Ноя 22, 2003 00:30:07

Что-то DialogBoxParam у меня не катит :-(


Дата: Ноя 22, 2003 00:39:10 · Поправил: Asterix

Косяк нашёл, вопрос снимается :-)


Дата: Ноя 22, 2003 01:46:17

> мой ламерский опыт свидетельствует - можно делать все что хочешь... пока не пнут

Не можно только вызывать LoadLibrary() =))


Дата: Ноя 22, 2003 02:25:43

Dr.Golova
То есть лоадить себя? Попробовать надо... Тоже пакость :)


Дата: Ноя 22, 2003 02:32:02

hGoblin
То есть лоадить себя?
Любую DLL. Также не катят WSAStartup, InitCommonControlsEx и прочие ф-ции, которые тоже грузят либы.


Дата: Ноя 22, 2003 02:42:23

Упс. А почему? Может, что почитать надо, а я не знал?


Дата: Ноя 22, 2003 02:44:46

Все, кажется, просек. Это потому что у dll-ки нет своего контекста, и грузить некуда?


Дата: Ноя 22, 2003 04:53:47

Хм.. Дурят нашего брата... Подправил Iczelionov туториал, скопировал в директорию к usedll.exe ASMGUID.DLL, запустил - пашет, мессагбох кажет один раз, ASMGUID не удаляется, значит - грузит!
krnl db "ASMGUID.DLL",0
.code
DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD
	.if reason==DLL_PROCESS_ATTACH
		invoke MessageBox,NULL,addr LoadMsg,addr AppName,MB_OK
		invoke LoadLibrary,addr krnl
            test eax,eax
            jnz @OK
     		invoke MessageBox,NULL,addr LoadMsg,addr AppName,MB_OK
            @OK:
.elseif .......


Дата: Ноя 22, 2003 17:20:00

Далеко не для всех dll будет работать.
Загрузи user32.dll и пропробуй оттуда дернуть MessageBoxA - о результатах доложить - если я правильно помню историю трехлетней давности - прога просто падала.


Дата: Ноя 22, 2003 18:50:51

Все нормально, грузится как обычно, без проишествий. Попробовал в качестве нагрузки к MessageBox InitCommonControls (кстати, разве она грузит длл?, Iczelion говорил, там один ret ;) - не падает, и все тут! Может, это только у нас, динозавров на '98? NT-подобных у меня нет, проверить не могу :(


Дата: Ноя 22, 2003 19:41:08

MSDN :
Warning The entry-point function should perform only simple initialization or termination tasks. It must not call the LoadLibrary or LoadLibraryEx function (or a function that calls these functions), because this may create dependency loops in the DLL load order. This can result in a DLL being used before the system has executed its initialization code. Similarly, the entry-point function must not call the FreeLibrary function (or a function that calls FreeLibrary), because this can result in a DLL being used after the system has executed its termination code.

It is safe to call other functions in Kernel32.dll, because this DLL is guaranteed to be loaded in the process address space when the entry-point function is called. It is common for the entry-point function to create synchronization objects such as critical sections and mutexes, and use TLS. Do not call the registry functions, because they are located in Advapi32.dll. If you are dynamically linking with the C run-time library, do not call malloc; instead, call HeapAlloc.

Calling imported functions other than those located in Kernel32.dll may result in problems that are difficult to diagnose. For example, calling User, Shell, and COM functions can cause access violation errors, because some functions in their DLLs call LoadLibrary to load other system components. Conversely, calling those functions during termination can cause access violation errors because the corresponding component may already have been unloaded or uninitialized.

Because DLL notifications are serialized, entry-point functions should not attempt to communicate with other threads or processes. Deadlocks may occur as a result.

Note To provide more complex initialization, create an initialization routine for the DLL. You can require applications to call the initialization routine before calling any other routines in the DLL. Otherwise, you can have the initialization routine create a named mutex, and have each routine in the DLL call the initialization routine if the mutex does not exist. Be sure to use a unique mutex name for each process that loads the DLL.

А если мы имеем в процессе некоторые delay-load либы, то это может произойти весьма легко.


Дата: Ноя 23, 2003 06:18:04

hGoblin
InitCommonControls (кстати, разве она грузит длл?, Iczelion говорил, там один ret ;) - не падает, и все тут!
Такой апи для меня вообще нет. Я имел в виду InitCommonControlsEx. Вообще послушайте опытных людей! Возможность глюков более чем реальна. Потом никакой отладчик не спасёт ;-)


Дата: Ноя 23, 2003 06:52:39 · Поправил: hGoblin

Так слушаю же! Но не верю на слово :) InitCommonControlsEx я у себя не нашел. Говорю же - динозавр, а пираты родного города не позаботились о снабжении меня WindowsNT (2k, тем паче XP из принципа не покупаю) :( Вот и пришлось вызывать без Ex. Хотя долго чесал в затылке, проводя аналогии: CreateWindow/Ex - простая - расширенная, как же они ret расширить умудрились? В общем, скромно молчу в тряпочку, пока не разживусь где-нибудь NT+MSDN
И все-таки пока не уроню прогу, не пойму, почему она падает. В теории нифига не понятно - где функции могут быть вызваны до инициализации, если
а)DLL notifications are serialized
б)что в длл, что в основном коде ф-ии вызываются после LoadLibrary
Все же правильно должно быть - загрузил - проинициализировалась, если и в exe и в dll грузится одна и та же либа, то она лишь проинициализируется два раза (с разными параметрами), и все... нет, не понимаю :(

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.125