PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Загрузка dll


Загрузка dll

Сообщений 1 страница 2 из 2

1

Я так понял компилятор не приспособлен компилить длл с точкой входа при её загрузки допустим пользовательской DllMain()
Соответственно код что относится к длл перенесётся на реализацию в программе?
пример дллки

Код:
Procedure debug_ohibka(s$)
Protected *Bufer
*Bufer=AllocateMemory(200)
FormatMessage_(#FORMAT_MESSAGE_FROM_SYSTEM,0, GetLastError_(), #LANG_NEUTRAL, *Bufer, 200,0)
MessageRequester("Событие "+s$,Str(GetLastError_())+" "+PeekS(*Bufer,-1,#PB_Unicode))
FreeMemory(*Bufer)
EndProcedure
ProcedureDLL.i DllEntryPoint(hinstDLL,fdwReason,*lpReserved)
         debug_ohibka("DllEntryPoint "+Str(hinstDLL)+"===*fdwReason==="+Str(fdwReason))
EndProcedure

ProcedureDLL.i DllMain(hinstDLL,fdwReason,*lpReserved)
  
  debug_ohibka("DllMain "+Str(hinstDLL)+"===*fdwReason==="+Str(fdwReason))
  Select fdwReason
     Case #DLL_PROCESS_ATTACH;при загрузке DLL в поток, инициировавший её загрузку
       debug_ohibka("DllMain #DLL_PROCESS_ATTACH "+Str(hinstDLL)+"===*fdwReason==="+Str(fdwReason))
     Case #DLL_THREAD_ATTACH;при создании нового потока в процессе, владеющем DLL
       debug_ohibka("DllMain #DLL_THREAD_ATTACH "+Str(hinstDLL)+"===*fdwReason==="+Str(fdwReason))
     Case #DLL_THREAD_DETACH;при завершении не последнего потока в процессе
       debug_ohibka("DllMain #DLL_THREAD_DETACH "+Str(hinstDLL)+"===*fdwReason==="+Str(fdwReason))
     Case #DLL_PROCESS_DETACH;при завершении не последнего потока в процессе при завершении последнего потока в "жизни DLL
       debug_ohibka("DllMain #DLL_PROCESS_DETACH "+Str(hinstDLL)+"===*fdwReason==="+Str(fdwReason)) 
    EndSelect   
EndProcedure

и её загрузки

Код:
#DONT_RESOLVE_DLL_REFERENCES=$00000001
#LOAD_IGNORE_CODE_AUTHZ_LEVEL=$00000010
#LOAD_LIBRARY_AS_DATAFILE=$00000002
#LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE=$00000040
#LOAD_LIBRARY_AS_IMAGE_RESOURCE=$00000020
#LOAD_LIBRARY_SEARCH_APPLICATION_DIR=$00000200
#LOAD_LIBRARY_SEARCH_DEFAULT_DIRS=$00001000
#LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR=$00000100
#LOAD_LIBRARY_SEARCH_SYSTEM32=$00000800
#LOAD_LIBRARY_SEARCH_USER_DIRS=$00000400
#LOAD_WITH_ALTERED_SEARCH_PATH=$00000008
#LOAD_LIBRARY_REQUIRE_SIGNED_TARGET=$00000080
#LOAD_LIBRARY_SAFE_CURRENT_DIRS=$00002000

deskriptor.i = LoadLibraryEx_("~tests_dll.dll",0,#LOAD_IGNORE_CODE_AUTHZ_LEVEL)
Debug deskriptor
 FreeLibrary_(deskriptor)

показывет что по точкам входа не работает!
ps: инфа
Ссылка

Отредактировано Sergeihik (16.10.2022 16:39:19)

0

2

Sergeihik написал(а):

показывет что по точкам входа не работает!

Просто вы неправильно ее готовите используете. В справке написано

For advanced programmers: there is 4 special procedures which are called automatically by the OS when one of the following events happen:

- DLL is attached to a new process
- DLL is detached from a process
- DLL is attached to a new thread
- DLL is detached from a thread

To handle that, it's possible to declare 4 special procedures called: AttachProcess(Instance), DetachProcess(Instance), AttachThread(Instance) and DetachThread(Instance). This means these 4 procedures names are reserved and can't be used by the programmer for other purposes.

Код:
Procedure debug_ohibka(s$)
  Protected *Bufer
  *Bufer=AllocateMemory(200)
  FormatMessage_(#FORMAT_MESSAGE_FROM_SYSTEM,0, GetLastError_(), #LANG_NEUTRAL, *Bufer, 200,0)
  MessageRequester("Событие "+s$,Str(GetLastError_())+" "+PeekS(*Bufer,-1,#PB_Unicode))
  FreeMemory(*Bufer)
EndProcedure


ProcedureDLL AttachProcess(Instance)
  debug_ohibka("DllMain #DLL_PROCESS_ATTACH "+Str(Instance))
EndProcedure

ProcedureDLL DetachProcess(Instance)
  debug_ohibka("DllMain #DLL_THREAD_ATTACH "+Str(Instance))
EndProcedure

ProcedureDLL AttachThread(Instance)
  debug_ohibka("DllMain #DLL_THREAD_DETACH "+Str(Instance))
EndProcedure

ProcedureDLL DetachThread(Instance)
  debug_ohibka("DllMain #DLL_PROCESS_DETACH "+Str(Instance)) 
EndProcedure

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Загрузка dll