· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› тред против процесса

<< . 1 . 2 .

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


Дата: Июл 2, 2003 14:44:08 · Поправил: Four-F

[ Quantum: Мне не совсем понятно какое отношение имеет диалог к тредам? ]

Самое прямое. У каждого диалога есть диалоговая процедура, код которой нужно выполнять. Этим как раз поток и занимается. Причем только поток создавший диалог. Когда поток создает диалог, вызывая одну из многочисленных CreateDialogXXX или DialogBoxXXX, система создает очередь сообщений для этого диалога и сопоставляет ее с потоком вызвавшим эту функцию. Все сообщения приходящие в эту очередь будут обрабатываться именно этим потоком. Есть даже функция PostThreadMessage, с помощью которой можно поместить сообщение в очередь конкретного потока.


[ Quantum: Диалог работает потому что модуль уже маппирован в память вместе с ресурсами и его instance является валидным. ]

Диалог создается именно вызовом функции создания диалога (см. выше). Маппирование модуля в память, пусть даже в его ресурсах 100 диалогов, не приводит к созданию этих диалогов до тех пор, пока это не будет сделано явно.

[ Quantum: Instance как-то связан с тредом? ]

Нет. Поток никак не привязан к модулю его создавшему. А вот диалог да. Точнее его ресурс. При создании диалога нужно явно указать в каком модуле находится ресурс диалога.

Прикола ради, я набросал простенькое приложение. Exe+Dll. В каждом модуле сидит один и тот же диалог - при линковке исползуется один rsrc.obj. Каждый модуль запускает диалог из своих ресурсов, используя свой hInstance. Exe запускает и обрабатывает свой диалог используя основной поток. Dll создает свой поток в DllMain и запускает с помощью него свой диалог. Оба диалога живут независимо друг от друга, до тех пор, разумеется, пока жив процесс. Если закрыть диалог созданный длл, то екзешный диалог, естественно, продолжает жить. Если закрыть екзешный диалог, то вызывается ExitProcess и оба диалога умирают, что тоже вполне естественно.

Был бы блин аттач... придется так постить :-( Макросы из KmdKit.

==============================================
exe.asm - собирается как обычно и в ресурсами
==============================================


.386
.model flat, stdcall
option casemap:none

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
; I N C L U D E F I L E S
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

include \masm32\include\windows.inc

include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib

include \masm32\Macros\Strings.mac

includelib dll.lib

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
; F U N C T I O N S P R O T O T Y P E S
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

DlgProc proto :HWND, :UINT, :WPARAM, :LPARAM
FakeProc proto

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
; E Q U A T E S
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

IDD_DIALOG equ 1000

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
; U N I N I T I A L I Z E D D A T A
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

.data?
g_hInstance HINSTANCE ?

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
; C O D E
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

.code

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
; DlgProc
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

DlgProc proc hDlg:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

local hDC:HDC
local ps:PAINTSTRUCT
local rect:RECT
local buffer[128]:CHAR
local hFont:HFONT
local hOldFont:HFONT

.if uMsg == WM_PAINT

invoke BeginPaint, hDlg, addr ps
mov hDC, eax
invoke GetClientRect, hDlg, addr rect

invoke GetCurrentThreadId
invoke wsprintf, addr buffer, $CTA0("Exe\:DlgProc is processing WM_PAINT. Thread ID = %X"), eax

invoke GetStockObject, ANSI_VAR_FONT
mov hFont, eax

invoke SelectObject, hDC, hFont
mov hOldFont, eax

invoke GetSysColor, COLOR_BTNFACE

invoke SetBkColor, hDC, eax

invoke DrawText, hDC, addr buffer, -1, addr rect, DT_SINGLELINE + DT_CENTER + DT_VCENTER

invoke SelectObject, hDC, hOldFont

invoke EndPaint, hDlg, addr ps

.elseif uMsg == WM_COMMAND

mov eax, wParam
and eax, 0FFFFh
.if eax == IDCANCEL
invoke EndDialog, hDlg, 0
.endif

.else

xor eax, eax
ret

.endif

xor eax, eax
inc eax
ret

DlgProc endp

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
; start
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

start proc

local buffer[128]:CHAR

invoke GetModuleHandle, NULL
mov g_hInstance, eax

invoke GetCurrentThreadId
invoke wsprintf, addr buffer, \
$CTA0("Thread with ID = %X is about to create dialog\nfrom module with hInstance = %X"), \
eax, g_hInstance
invoke MessageBox, NULL, addr buffer, $CTA0("Exe\:start"), MB_OK

invoke DialogBoxParam, g_hInstance, IDD_DIALOG, NULL, addr DlgProc, 0

invoke GetCurrentThreadId
invoke wsprintf, addr buffer, $CTA0("Thread with ID = %X is about to exit"), eax
invoke MessageBox, NULL, addr buffer, $CTA0("Exe\:start"), MB_OK

invoke ExitProcess, eax
invoke FakeProc ; to make linking with dll.dll

start endp

end start



==============================================
dll.asm - для сборки юзать blddll.bat
==============================================

.386
.model flat, stdcall
option casemap:none

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
; I N C L U D E F I L E S
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

include \masm32\include\windows.inc

include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib

include \masm32\Macros\Strings.mac

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
; F U N C T I O N S P R O T O T Y P E S
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

DlgProc proto :HWND, :UINT, :WPARAM, :LPARAM

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
; E Q U A T E S
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

IDD_DIALOG equ 1000

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
; U N I N I T I A L I Z E D D A T A
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

.data?
g_hInstance HINSTANCE ?

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
; C O D E
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

.code

DlgProc proc hDlg:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

local hDC:HDC
local ps:PAINTSTRUCT
local rect:RECT
local buffer[128]:CHAR
local hFont:HFONT
local hOldFont:HFONT

.if uMsg == WM_PAINT

invoke BeginPaint, hDlg, addr ps
mov hDC, eax
invoke GetClientRect, hDlg, addr rect

invoke GetCurrentThreadId
invoke wsprintf, addr buffer, $CTA0("Dll\:DlgProc is processing WM_PAINT. Thread ID = %X"), eax

invoke GetStockObject, ANSI_VAR_FONT
mov hFont, eax

invoke SelectObject, hDC, hFont
mov hOldFont, eax

invoke GetSysColor, COLOR_BTNFACE

invoke SetBkColor, hDC, eax

invoke DrawText, hDC, addr buffer, -1, addr rect, DT_SINGLELINE + DT_CENTER + DT_VCENTER

invoke SelectObject, hDC, hOldFont

invoke EndPaint, hDlg, addr ps

.elseif uMsg == WM_COMMAND

mov eax, wParam
and eax, 0FFFFh
.if eax == IDCANCEL
invoke EndDialog, hDlg, 0
.endif

.else

xor eax, eax
ret

.endif

xor eax, eax
inc eax
ret

DlgProc endp

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
; ThreadProc
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

ThreadProc proc Param:DWORD

local buffer[128]:CHAR

invoke GetCurrentThreadId
invoke wsprintf, addr buffer, \
$CTA0("Thread with ID = %X is about to create dialog\nfrom module with hInstance = %X"), \
eax, g_hInstance
invoke MessageBox, NULL, addr buffer, $CTA0("Dll\:ThreadProc"), MB_OK

invoke DialogBoxParam, g_hInstance, IDD_DIALOG, NULL, addr DlgProc, 0

invoke GetCurrentThreadId
invoke wsprintf, addr buffer, $CTA0("Thread with ID = %X is about to exit"), eax
invoke MessageBox, NULL, addr buffer, $CTA0("Dll\:ThreadProc"), MB_OK

ret

ThreadProc endp

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
; DllEntry
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD

local hThread:HANDLE
local buffer[64]:CHAR

.if reason == DLL_PROCESS_ATTACH
mov eax, hInstance
mov g_hInstance, eax

invoke DisableThreadLibraryCalls, g_hInstance

push eax
invoke CreateThread, NULL, 0, offset ThreadProc, 0, 0, esp
pop ecx
.if eax != NULL

mov hThread, eax
invoke wsprintf, addr buffer, $CTA0("Thread with ID = %X created."), ecx
invoke MessageBox, NULL, addr buffer, $CTA0("Dll\:DllEntry"), MB_OK

invoke CloseHandle, hThread
.endif

.endif

xor eax, eax
inc eax
ret

DllEntry Endp

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

FakeProc proc

ret

FakeProc endp

end DllEntry



==============================================
dll.def
==============================================

LIBRARY dll
EXPORTS FakeProc



==============================================
blddll.bat - батник для сбора длл
==============================================

@echo off

if exist dll.obj del dll.obj
if exist dll.dll del dll.dll

\masm32\bin\ml /c /coff dll.asm

\masm32\bin\Link /SUBSYSTEM:WINDOWS /DLL /DEF:dll.def dll.obj rsrc.obj

pause



==============================================
rsrc.rc - ресурсы компилируются как обычно
==============================================

#include "C:\MASM32\mProgs\Include\resource.h"

#define IDD_DIALOG 1000

IDD_DIALOG DIALOG 0, 0, 200, 50
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME |
WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED

CAPTION "Dialog"

FONT 8, "MS Sans Serif"

BEGIN
END



Эксперименты с этим проектом помогут снять все вопросы.

ЗЫ: Блин, какое все-таки удовольствие получаешь пися... пиша... блин... от написания таких простых программулек.

Это, наверное, мой самый длинный пост. Типа отпуск начался, вот я и маюсь... ;-)


Дата: Июл 2, 2003 19:35:29

>Кстати, а что происходит после возвращения из DllMain? Возможно MessageBox просто не успевает показаться, если программа заканчивается СРАЗУ после вызова DLL.

похоже так и было :/ ... буду пробовать еще варианты... и из ru.visual.cpp тоже написали, что из инита .dll нежелательно ничего делать, надо создавать отдельную функцию и в ней уже делать что хочется...

>ЗЫ: Код Drakon_Rider у меня прекрасно работает, но всё-таки...

эт радует :) ... значит и здесь когда-нить получится...


Дата: Июл 2, 2003 22:41:46

[ Drakon_Rider: ...буду пробовать еще варианты... ]

Ты реши сначала, а зачем оно вообще нужно создавать диалог из длл. Я могу придумать пару, чисто гипотетических вариантов, когда это может понадобиться, но... А так, в общем, можно создавать что угодно и откуда угодно, если понимаешь как и зачем. Пока не понятно, зачем тебе нужен диалог созданный из длл.


Дата: Июл 2, 2003 23:36:13

> Я могу придумать пару, чисто гипотетических вариантов, когда это может понадобиться, но...

Например если это какой-нибудь dll'ный plugin.


Дата: Июл 2, 2003 23:41:23

Four-F
Спасибо за наглядное объяснение! У меня есть похожий код. Сделал сьют с плагинами в отдельных DLL (ско-о-олько GPF'ов стерпел пока с тредами из под OOP разбирался...)

Эксперименты с этим проектом помогут снять все вопросы
Наоборот, вопросов станет больше :-)


Дата: Июл 2, 2003 23:43:30

UnFleshed One
Например если это какой-нибудь dll'ный plugin
О! Классический пример.


Дата: Июл 3, 2003 14:40:06 · Поправил: Four-F

[ Quantum: Наоборот, вопросов станет больше :-) ]

Тогда можно будет их спросить и жизнь будет продолжаться ;-)


Дата: Июл 3, 2003 18:59:56

>Ты реши сначала, а зачем оно вообще нужно создавать диалог из длл. Я могу придумать пару, чисто гипотетических вариантов, когда это может понадобиться, но..

у меня ситуация - надо к древней игровой программе прикрутить новую технологию управления камерой (в дополнение к имеющейся)... соотв лучшим вариантом добавления своих инструкций ЦПУ получается внешняя .dll ... т.к. особливо после VC++ ного сбора .dll она размером почти как весь .exe игровой программы :/ ...

соотв после запуска игровой программы мне надо проинициализировать устройства видеозахвата и вывести превьюшное изображение в отдельное окно, в котором надо мышекликнуть по некоторой точке и получить координаты этого мышеклика на последующую обработку... и при этом уже параллельно должна выполняться собственно игровая программа... так что это окно должно быт отдельным тредом получается... кроме того было бы хорошо, если бы в это окно можно было бы Alt+Tab из полноэкранного игрового режима и опять мышекликнуть по нему если надо указать новую точку... соотв во время выполнения игровой программы некоторые функции этой .dll получают медиасэмплы от устройства видеозахвата, вычисляют там кое-чего и изменяют настройки матриц 3D рендера игровой программы - каждый кадр - 25 фпс...

загрузку .dll я уже прикрутил и нашел место, в котором вычисляется та самая матрица направления и сдвига камеры, так что с помощью 2..4 функций из .dll все может заработать...

<< . 1 . 2 .


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