Поиск:

Ответ в темуСоздание новой темы Создание опроса
> dll отложенная загрузка 
:(
    Опции темы
rthsobakas
Дата 27.2.2009, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 562
Регистрация: 20.9.2007

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



кто нибудь знает как реализовать ОТЛОЖЕННУЮ ЗАГРУЗКУ ДЛЛ на ТАСМ? Инфтормации очень мало по этому поводу, единственнно что нашел у РИХТЕРА http://wm-help.net/books-online/book/59464/59464-14.html. Но там для визуал студии и я вообщем ничего не понял...

ДЛя примера выложу код. Прога вызывает из ДЛЛ процедуру которая в свою очередь вызывает МЕСАГУ.

Это длл модуль для явной загрузки.
Код

.486
; плоская модель
  .MODEL FLAT
PUBLIC DLLP1
; константы
; сообщения, приходящие при открытии
; динамической библиотеки
DLL_PROCESS_DETACH    equ 0
DLL_PROCESS_ATTACH    equ 1
DLL_THREAD_ATTACH     equ 2
DLL_THREAD_DETACH     equ 3
   EXTERN      MessageBoxA:NEAR
   MessageBoxA@16 = MessageBoxA
   includelib import32.lib
;--------------------------------------------------

; сегмент данных
_DATA SEGMENT DWORD PUBLIC USE32 'DATA'
     TEXT1 DB 'Вход в библиотеку',0
     TEXT2 DB 'Выход из библиотеки',0
     MS    DB 'Сообщение из библиотеки',0
     TEXT  DB 'Вызов процедуры из DLL',0
_DATA ENDS

; сегмент кода
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
; [EBP+10H]   ; резервный параметр
; [EBP+0CH]   ; причина вызова
; [EBP+8]     ; идентификатор DLL-модуля
DLLENTRY:
     MOV EAX,DWORD PTR [EBP+0CH]
     CMP EAX,0
     JNE D1
; закрытие библиотеки
     PUSH  0
     PUSH  OFFSET MS
     PUSH  OFFSET TEXT2
     PUSH  0
     CALL  MessageBoxA@16
     JMP _EXIT
D1:
     CMP EAX,1
     JNE _EXIT
; открытие библиотеки
     PUSH  0
     PUSH  OFFSET MS
     PUSH  OFFSET TEXT1
     PUSH  0
     CALL  MessageBoxA@16
_EXIT:
     MOV EAX,1
     RET 12

;———————————————————
; [EBP+8]    ; параметр процедуры
DLLP1 PROC EXPORT
     PUSH EBP
     MOV EBP,ESP
;     CMP DWORD PTR [EBP+8],1
;     JNE _EX
     PUSH 0
     PUSH OFFSET MS
     PUSH OFFSET TEXT
     PUSH 0
     CALL MessageBoxA@16
;_EX:
     POP EBP
     RET 4
DLLP1 ENDP
_TEXT ENDS
END DLLENTRY


это испольняемый модуль(экзшник).
Код

.386P
; плоская модель
.MODEL FLAT, stdcall
; константы
; прототипы внешних процедур
IFDEF MASM
;MASM
   EXTERN      GetProcAddress@8:NEAR
   EXTERN      LoadLibraryA@4:NEAR
   EXTERN      FreeLibrary@4:NEAR
   EXTERN      ExitProcess@4:NEAR
   EXTERN      MessageBoxA@16:NEAR
; директивы компоновщику для подключения библиотек
   includelib d:\masm32\lib\user32.lib
   includelib d:\masm32\lib\kernel32.lib
ELSE
; TASM
   EXTERN      GetProcAddress:NEAR
   EXTERN      LoadLibraryA:NEAR
   EXTERN      FreeLibrary:NEAR
   EXTERN      ExitProcess:NEAR
   EXTERN      MessageBoxA:NEAR
; директивы компоновщику для подключения библиотек
   includelib import32.lib
   GetProcAddress@8 = GetProcAddress
   LoadLibraryA@4 = LoadLibraryA
   FreeLibrary@4 = FreeLibrary
   ExitProcess@4 = ExitProcess
   MessageBoxA@16 = MessageBoxA
ENDIF
;-----------------------------------------

; сегмент данных
_DATA SEGMENT DWORD PUBLIC USE32 'DATA'
     TXT    DB 'Ошибка динамической библиотеки',0
     MS     DB 'Сообщение',0
     LIBR   DB 'dllYES.DLL',0
     HLIB   DD ?
IFDEF MASM
     NAMEPROC DB '_DLLP1@0',0
ELSE
     NAMEPROC DB 'DLLP1',0
ENDIF
_DATA ENDS

; сегмент кода
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
START:
; загрузить библиотеку
     PUSH OFFSET LIBR
     CALL LoadLibraryA@4
     CMP EAX,0
     JE _ERR
     MOV HLIB,EAX
; получить адрес процедуры
     PUSH OFFSET NAMEPROC
     PUSH HLIB
     CALL GetProcAddress@8
     CMP EAX,0
     JNE YES_NAME
; сообщение об ошибке
_ERR:
     PUSH  0
     PUSH  OFFSET MS
     PUSH  OFFSET TXT
     PUSH  0
     CALL  MessageBoxA@16
     JMP  _EXIT
YES_NAME:
     PUSH 1 ; параметр
     CALL EAX
; закрыть библиотеку
     PUSH HLIB
     CALL FreeLibrary@4
; библиотека автоматически закрывается также
; при выходе из программы
; выход
_EXIT:
     PUSH 0
     CALL ExitProcess@4
_TEXT ENDS
END START



Что должно в коде измениться , если я хочу сделать отложенную загрузку???



Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  yes.rar 516,09 Kb
PM   Вверх
dumb
Дата 3.3.2009, 05:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



Цитата(rthsobakas @  27.2.2009,  20:08 Найти цитируемый пост)
как реализовать ОТЛОЖЕННУЮ ЗАГРУЗКУ ДЛЛ на ТАСМ?
первый вопрос: зачем?

Цитата(rthsobakas @  27.2.2009,  20:08 Найти цитируемый пост)
Что должно в коде измениться , если я хочу сделать отложенную загрузку?
во-первых, отложенная загрузка работает вкупе со статическим связыванием, а у тебя в коде реализована динамическая загрузка твоей DLL. а статически прилинковываются у тебя kernel32.dll и user32.dll. т.е. для начала, тебе надо убрать всю "динамику"(loadlibrary/getprocaddress) и сделать "статику".

отложенная загрузка - механизм, предоставляемый компоновщиком(linker). tlink32 не предоставляет такой возможности. соответственно, тебе нужен другой компоновщик - например, из состава более поздних продуктов той же фирмы - ilink32.exe. также понадобится библиотека, содержащая код загрузчика(__delayLoadHelper) - cw32.lib

пример запуска компоновки для реализации отложенной загрузки USER32.DLL(после того, как сделаешь статику для своей DLL, заменишь USER32 на свою):
Код
ilink32 -v -aa -dUSER32.DLL exeYES.obj,,,cw32.lib


Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  ilink32.rar 447,55 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для Windows/DOS"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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