Здрасте. собственно сабж - нужно сделать свой контрол и сразу встал в стопор, да бы надо впихнуть его в DLL , но при LoadLibrary не вызывается DLLEntryProc, в чем может быть проблема? И где можно почитать про создание своих компонентов? Помогите пожалуйста...
DLLEntryProc ? вроде как точка входа всегда называлась DllMain Код (Text): BOOL WINAPI DllMain( HINSTANCE hinstDLL, // дескриптор модуля DLL DWORD fdwReason, // причина вызова функции LPVOID lpvReserved // зарезервированный ); Язык какой?
Насчёт дескриптора ты это пошутил Код (Text): BOOLEAN InitRoutine( IN PVOID DllHandle, IN ULONG Reason, IN PCONTEXT Context OPTIONAL ); Если есть сомнения насчёт Context, то смотрим LdrpInitializeProcess. Может быть ноль, может быть 1, а может быть указатель на контекст в стеке.
scf и Clerk я это все прекрасно знаю, а DllMain это просто скопипастено из языков высокого уровня, в конце концов, я же пишу на фасме, могу ее назвать и ДллГлавнаяФходнаяФункция. факт в том, что мне нужна инфа по созданию, своих компонентов и своих классов, если сможете предоставить буду весьма благодарен...
гуглим "fasm как написать dll" первая же ссылка ведет сюда: http://www.wasm.ru/article.php?article=macrofasm это так сложно?
dgs, раз фасм, то Код (Text): ;------------------------------------------------------------------------------; ; Compile with flat assembler v1.67+, <http://flatassembler.net/download.php>. ; ;------------------------------------------------------------------------------; format pe gui 4.1 dll at 0x11840000 entry DllEntryPoint include 'win32a.inc' DllEntryPoint: mov eax,[esp+0x08] ;DLLEntryPoint.fdwReason. dec eax ;Was DLL_PROCESS_ATTACH? jnz .skip .startup: stdcall [MessageBox],NULL,szHelloWorld,NULL,MB_ICONINFORMATION mov eax,[esp+0x04] ;DllEntryPoint.hInstDLL. mov [hInstance],eax xor eax,eax ;Clerk, оно проверяет на 1 или не-0? inc eax .skip: retn 0x0c szHelloWorld db 'Hello, world!',0 data import library kernel32,'KERNEL32.DLL',\ user32,'USER32.DLL' include 'api/kernel32.inc' include 'api/user32.inc' end data hInstance dd ? section '.reloc' data fixups discardable Работает?
Булевская переменная ноль, либо не ноль. Может быть 123. Само сабой с нулём сравнивается [ebp-21]: Код (Text): 7C91C4CA > /FF75 08 push dword ptr ss:[ebp+8] ; /Arg4 7C91C4CD . |33FF xor edi,edi ; | 7C91C4CF . |47 inc edi ; | 7C91C4D0 . |57 push edi ; |Arg3 => 00000001 7C91C4D1 . |FF76 18 push dword ptr ds:[esi+18] ; |Arg2 7C91C4D4 . |53 push ebx ; |Arg1 7C91C4D5 . |E8 9C4CFEFF call ntdll._LdrpCallInitRoutine@16 ; \_LdrpCallInitRoutine@16 7C91C4DA . |8845 DF mov byte ptr ss:[ebp-21],al 7C91C4DD . |897D FC mov dword ptr ss:[ebp-4],edi 7C91C4E0 . |E8 44000000 call ntdll.7C91C529 7C91C4E5 . |8365 FC 00 and dword ptr ss:[ebp-4],0 7C91C4E9 . |E8 4D000000 call ntdll.7C91C53B 7C91C4EE . |804E 36 08 or byte ptr ds:[esi+36],8 7C91C4F2 . |807D DF 00 cmp byte ptr ss:[ebp-21],0 7C91C4F6 . |0F84 BEE00100 je ntdll.7C93A5BA
гуд, все работает, забыл про DLL_PROCESS_ATTACH. Чем отличается создание компонента в dll, от того как он создается в экзешнике.
dgs, экспортируешь какую-нибудь InitMyClass, из неё вызываешь RegisterClassEx. Больше отличий нет. Clerk, спасибо. Значит, xor eax,eax/inc eax там не нужно)
Предпочитаю делать компоненты без регистрации класса и создания отдельного объекта с точки зрения Windows. Объектами Windows будут только контейнеры, включающие в себя целый набор разнотипных компонентов. Контейнером также может быть непосредственно окно верхнего уровня. Такой подход хорош, когда создается полностью независимая система GUI с оригинальным дизайном, набором свойств и событий для компонентов в пределах отдельно взятого приложения. Т.е. когда при взгляде лишь на данное приложение на принадлежность виндам вообще ничего не указывает. Более того, такой подход хорош для создания трансплатформенных приложений, чей интерфейс должен быть полностью идентичен, в том числе и с точки зрения внешнего вида (дизайна). Меняется лишь подсистема поддержки, т.е. ограниченный набор процедур, а весь остальной код остается неизменным вплоть до бинарного уровня, если он используется на одной и той же аппаратной платформе (к примеру x86). Если речь идет о "доводке" отдельно взятого компонента, добавления какой-то оригинальной черты, тогда возможно от механизма классов/окон Windows отказываться не стоит.
А если стандартным, см аттач. Хотел когда-то выжать из него ключевые строки и сделать статью о контролах, но позже посчитал это слишком простым или естественным. делал его, чтобы отмечать определенные дни недели в какой-то программе.