Собственный компонент

Тема в разделе "WASM.BEGINNERS", создана пользователем dgs, 21 мар 2009.

  1. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Здрасте. собственно сабж - нужно сделать свой контрол и сразу встал в стопор, да бы надо впихнуть его в DLL , но при LoadLibrary не вызывается DLLEntryProc, в чем может быть проблема? И где можно почитать про создание своих компонентов? Помогите пожалуйста...
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    dgs
    > при LoadLibrary не вызывается DLLEntryProc
    Может быть, для начала разобраться с этим?
     
  3. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    DLLEntryProc ? вроде как точка входа всегда называлась DllMain
    Код (Text):
    1. BOOL WINAPI DllMain(
    2.   HINSTANCE hinstDLL,  // дескриптор модуля DLL
    3.   DWORD fdwReason,     // причина вызова функции
    4.   LPVOID lpvReserved   // зарезервированный
    5. );
    Язык какой?
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Насчёт дескриптора ты это пошутил :dntknw:
    Код (Text):
    1. BOOLEAN
    2. InitRoutine(
    3.     IN PVOID DllHandle,
    4.     IN ULONG Reason,
    5.     IN PCONTEXT Context OPTIONAL
    6.     );
    Если есть сомнения насчёт Context, то смотрим LdrpInitializeProcess. Может быть ноль, может быть 1, а может быть указатель на контекст в стеке.
     
  5. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    гм, разработчики ядра винды отказались от болгарки?
     
  6. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    scf и Clerk я это все прекрасно знаю, а DllMain это просто скопипастено из языков высокого уровня, в конце концов, я же пишу на фасме, могу ее назвать и ДллГлавнаяФходнаяФункция. факт в том, что мне нужна инфа по созданию, своих компонентов и своих классов, если сможете предоставить буду весьма благодарен...
     
  7. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    гуглим "fasm как написать dll"
    первая же ссылка ведет сюда:
    http://www.wasm.ru/article.php?article=macrofasm

    это так сложно?
     
  8. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    dgs, раз фасм, то
    Код (Text):
    1. ;------------------------------------------------------------------------------;
    2. ; Compile with flat assembler v1.67+, <http://flatassembler.net/download.php>. ;
    3. ;------------------------------------------------------------------------------;
    4.         format  pe gui 4.1 dll at 0x11840000
    5.         entry   DllEntryPoint
    6.         include 'win32a.inc'
    7.  
    8. DllEntryPoint:
    9.         mov     eax,[esp+0x08]          ;DLLEntryPoint.fdwReason.
    10.         dec     eax                     ;Was DLL_PROCESS_ATTACH?
    11.         jnz    .skip
    12.     .startup:
    13.         stdcall [MessageBox],NULL,szHelloWorld,NULL,MB_ICONINFORMATION
    14.         mov     eax,[esp+0x04]          ;DllEntryPoint.hInstDLL.
    15.         mov     [hInstance],eax
    16.         xor     eax,eax                 ;Clerk, оно проверяет на 1 или не-0?
    17.         inc     eax
    18.     .skip:
    19.         retn    0x0c
    20.  
    21. szHelloWorld    db      'Hello, world!',0
    22.  
    23.  
    24.         data    import
    25.         library kernel32,'KERNEL32.DLL',\
    26.                 user32,'USER32.DLL'
    27.         include 'api/kernel32.inc'
    28.         include 'api/user32.inc'
    29.         end     data
    30.  
    31. hInstance       dd      ?
    32.  
    33. section '.reloc' data fixups discardable
    Работает?
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Булевская переменная ноль, либо не ноль. Может быть 123. Само сабой с нулём сравнивается [ebp-21]:
    Код (Text):
    1. 7C91C4CA      > /FF75 08         push dword ptr ss:[ebp+8]                      ; /Arg4
    2. 7C91C4CD      . |33FF            xor edi,edi                                    ; |
    3. 7C91C4CF      . |47              inc edi                                        ; |
    4. 7C91C4D0      . |57              push edi                                       ; |Arg3 => 00000001
    5. 7C91C4D1      . |FF76 18         push dword ptr ds:[esi+18]                     ; |Arg2
    6. 7C91C4D4      . |53              push ebx                                       ; |Arg1
    7. 7C91C4D5      . |E8 9C4CFEFF     call ntdll._LdrpCallInitRoutine@16             ; \_LdrpCallInitRoutine@16
    8. 7C91C4DA      . |8845 DF         mov byte ptr ss:[ebp-21],al
    9. 7C91C4DD      . |897D FC         mov dword ptr ss:[ebp-4],edi
    10. 7C91C4E0      . |E8 44000000     call ntdll.7C91C529
    11. 7C91C4E5      . |8365 FC 00      and dword ptr ss:[ebp-4],0
    12. 7C91C4E9      . |E8 4D000000     call ntdll.7C91C53B
    13. 7C91C4EE      . |804E 36 08      or byte ptr ds:[esi+36],8
    14. 7C91C4F2      . |807D DF 00      cmp byte ptr ss:[ebp-21],0
    15. 7C91C4F6      . |0F84 BEE00100   je ntdll.7C93A5BA
     
  10. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    гуд, все работает, забыл про DLL_PROCESS_ATTACH. Чем отличается создание компонента в dll, от того как он создается в экзешнике.
     
  11. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    dgs, экспортируешь какую-нибудь InitMyClass, из неё вызываешь RegisterClassEx. Больше отличий нет.
    Clerk, спасибо. Значит, xor eax,eax/inc eax там не нужно)
     
  12. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Предпочитаю делать компоненты без регистрации класса и создания отдельного объекта с точки зрения Windows. Объектами Windows будут только контейнеры, включающие в себя целый набор разнотипных компонентов. Контейнером также может быть непосредственно окно верхнего уровня. Такой подход хорош, когда создается полностью независимая система GUI с оригинальным дизайном, набором свойств и событий для компонентов в пределах отдельно взятого приложения. Т.е. когда при взгляде лишь на данное приложение на принадлежность виндам вообще ничего не указывает. Более того, такой подход хорош для создания трансплатформенных приложений, чей интерфейс должен быть полностью идентичен, в том числе и с точки зрения внешнего вида (дизайна). Меняется лишь подсистема поддержки, т.е. ограниченный набор процедур, а весь остальной код остается неизменным вплоть до бинарного уровня, если он используется на одной и той же аппаратной платформе (к примеру x86). Если речь идет о "доводке" отдельно взятого компонента, добавления какой-то оригинальной черты, тогда возможно от механизма классов/окон Windows отказываться не стоит.
     
  13. DarkWanderer

    DarkWanderer New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2006
    Сообщения:
    333
    Адрес:
    Барнаул.
    А если стандартным, см аттач.
    Хотел когда-то выжать из него ключевые строки и сделать статью о контролах, но позже посчитал это слишком простым или естественным. делал его, чтобы отмечать определенные дни недели в какой-то программе.