Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/56: Рейтинг темы: голосов - 56, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 05.11.2008
Сообщений: 9

Создание потока в DLL

17.11.2008, 20:54. Показов 10977. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех.

В системе стартует DLL (с помощью ключей windows). То что она стартует, проверено выводом окна MessageBox. Теперь я хочу в этой DLL создать поток и пишу код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
HANDLE  hThread=NULL;
void WINAPI Start(void);
 
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
switch(reason)
  {
   case DLL_PROCESS_ATTACH:
     {
       if(lpReserved) {}
                else
                  {  
                        DWORD dwThreadId;
                        hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)*Start,0,0,&dwThreadId);
                         if(hThread==NULL)
                         { MessageBox(NULL, "Ошибка создания потока", "DLLMain", MB_OK);        break;       }
                         break;
                  }
     }
 
   case DLL_PROCESS_DETACH:
     {  TerminateThread(hThread, 0); break;    }
   }
        return 1;
}
//------------
void WINAPI Start(void)
{
  MessageBox(NULL, "In Thread", "DLLMain", MB_OK);
  return ;
}
Только почему то поток этот не создается. Если же вызываю функцию Start без потока, то она работает. Кто нибудь может подсказать в чем ошибка?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.11.2008, 20:54
Ответы с готовыми решениями:

Создание потока из DLL
Господа, подкиньте инфы о создании потока из DLL, наверняка кто-то делал подобные дллки, и может поделиться примерами, а то в интернете и...

Создание потока в DLL
Ребят, дайте ссылку на тему, где можно про это почитать. Через поиск в разделе не нашел...

Создание нового потока из работающего потока
насколько это корректно? вроде всё нормально работает и именно так как задумывалось, но вопрос таки возник

10
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
18.11.2008, 18:24
Насколько я понял из хелпа, нельзя создать поток во время инициализации DLL. Возможно, я неправильно понял хелп.
0
 Аватар для xalyavius
12 / 12 / 0
Регистрация: 08.10.2008
Сообщений: 105
18.11.2008, 20:59
Цитата Сообщение от Vovan-VE Посмотреть сообщение
Насколько я понял из хелпа, нельзя создать поток во время инициализации DLL. Возможно, я неправильно понял хелп.
Все правильно, Vovan-VE прав. Но это не все.
Во первых: код создания потока надо перенести в другую функцию, процедуру инициализации надо оставить в покое.
Во вторых: эта функция (где создается поток) должна экспортироваться и видна снаружи библиотеки
В третьих: вы должны после создания потока, создать обьект события Event (к примеру) который будет сигнализировать что запущеный поток завершился (с помощью wait-функции).
В четвертых: перед завершением процедуры, выполняемой в другом потоке, нужно усановить ивент в сигнальное положение (чтоб wait-функция сработала).
Фишка в том, что если не использовать wait-функцию (или другой способ синхронизации) то созданный вами поток завершится вместе с завершением создавшей его процедуры (так как в этот момент умирает весь процесс).

Что бы все что я написал выше стало хоть немного понятнее приведу код на PowerBasic:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#compiler pbwin
#compile dll "testlib.dll"
#dim all
#include  "win32api.inc"
 
'Variables:---------------------------------------------------------------------
global hInst   as dword 'дискриптор модуля
global hThread as dword
global dwThreadID as dword
global hEvent  as dword
'-------------------------------------------------------------------------------
 
'Declare local:-----------------------------------------------------------------
declare function start() as long
'-------------------------------------------------------------------------------
 
'Declare export:----------------------------------------------------------------
declare function rundll stdcall alias "rundll" ()  as long
'-------------------------------------------------------------------------------
 
'###########################   MAIN ENTRY POINT   ##############################
function libmain(byval hInstance as dword, byval fwdreason as long, byval lpvreserved as long) as long
    select case fwdreason
    case %DLL_PROCESS_ATTACH
        hInst = hInstance
    case %DLL_PROCESS_DETACH
    case %DLL_THREAD_ATTACH
        hInst = hInstance
    case %DLL_THREAD_DETACH
    end select
    function = 1
end function
'###############################################################################
 
'===============================================================================
function rundll() export as long 'экспортируемая функция
    hThread = CreateThread(byval 0,0,codeptr(start),0,0, dwThreadID)        'создаем поток
    if isfalse hThread then MessageBox(0, "Ошибка создания потока", "DLLMain", %MB_OK) : exit function 'выходим если не создался
    hEvent = CreateEvent(byval 0, %TRUE, %FALSE, "exit")    'создаем обьект совытия (Event)
    WaitForSingleObject(hEvent, %INFINITE) 'ждем пока ивент не перейдет в сигнальный режим
    function = 1
end function
 
'===============================================================================
function start() as long
    
    msgbox("ok")
    SetEvent(hEvent) 'переводим Event в сигнальную позицию
end function
Библиотечку запускаю так: rundll32 testlib.dll rundll ()
0
0 / 0 / 0
Регистрация: 05.11.2008
Сообщений: 9
19.11.2008, 15:09  [ТС]
Допустим вы правы, тогда как объяснить следующий код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <windows.h>
//---------------------------------------------------------------------------
VOID ExitComp();
 
DWORD WINAPI Start(LPVOID lpParam);
 
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
DWORD x=1;
switch(reason)
  {
   case DLL_PROCESS_ATTACH:
     {
       if(lpReserved) {}
                else
                  {
                      HANDLE Mutex=OpenMutex(MUTEX_ALL_ACCESS,false,"OneInstanceAllowed");
                         if(Mutex==NULL)
                         {
                          Mutex=CreateMutex(NULL,true,"OneInstanceAllowed");
                         } else{SendMessage(HWND_BROADCAST,RegisterWindowMessage("OnlyOne"),0,0);return 0; }
                        // MessageBox(NULL, "Процесс подключил DLL динамически", "DLLMain", MB_OK);
                        DWORD  dwThreadId;
                        HANDLE  hThread=CreateThread(NULL,0,Start,(LPVOID)x,0,&dwThreadId);
                         if(hThread==NULL)
                         {
                                break;
                         }
                         CloseHandle(hThread);
                        // Start();
                         break;
                  }
     }
 
   case DLL_PROCESS_DETACH:
     {
      // MessageBox(NULL, "Процесс отключил DLL", "DLLMain", MB_OK);
       break;
     }   
   }
  return 1;
}
//---------------------
DWORD WINAPI Start(LPVOID lpParam)
{
...
//тут код который выполняется до выключения компа
//тут же вызывается функция ExitComp(); при определенных условиях, которая выключает комп
...
    return 1;
}
Этот вышеуказанный код работает. Я его 2 года назад написал. Теперь по этому же принципу еще хочу написать, только вот ошибка какая то не понятная.
DLL эта стартовала при запуске windows, с помощью ключей реестра. И все в ней прекрасно работает, и запись в реестр, и сообщения выскакивают. Как тогда объяснить этот случай?. Код разрабатывался в XP (как и сейчас), а работает он в XP и в win2000.
0
 Аватар для xalyavius
12 / 12 / 0
Регистрация: 08.10.2008
Сообщений: 105
19.11.2008, 18:11
А что тут объяснять? .Nikita, из вашего первого поста я понял что вы библеотечку запускаете так же как я, используя rundll32. Так вот в этом случае работать не будет не первый, не второй преведенный вами код. Если поместить запись в ключике реестра, в котром содержаться имена библиотек которые будут подгружаться во все запускаемые процессы (не помню как такой ключик называется, но узнать не сложно), то приведенный код будет работать и запускать поток.
А как вы запускаете вашу dll, с помощью какого ключа реестра?
0
0 / 0 / 0
Регистрация: 05.11.2008
Сообщений: 9
19.11.2008, 18:39  [ТС]
Я писал в первом посту:
В системе стартует DLL (с помощью ключей windows). То что она стартует, проверено выводом окна MessageBox. Теперь я хочу в этой DLL создать поток и пишу код: ...
слово rundll32 вроде бы в своих постах вообще не употреблял.

Библиотеку запускаю именно так как ты сказал, ключиком реестра во все процессы.
Попробовал я запустить функцию (в том месте где запуск потока) и в этой функции создать поток, но результат тот же. Функция запускается (вывожу там MessageBox), а вот поток нет. И никак не пойму в чем дело. Кучу инфы перечитал, тщетно.
0
 Аватар для xalyavius
12 / 12 / 0
Регистрация: 08.10.2008
Сообщений: 105
20.11.2008, 18:31
Цитата Сообщение от .Nikita Посмотреть сообщение
Функция запускается (вывожу там MessageBox), а вот поток нет.
Ну если поток не создается (hThread=NULL) то вызови GetLastError() посмотри что за код ошибки, может поможет?
0
0 / 0 / 0
Регистрация: 05.11.2008
Сообщений: 9
21.11.2008, 11:56  [ТС]
В том то и дело что hThread отличен от NULL. Ноя все равно вызывал GetLastError и она мне выдавала Опереция успешно завершена.
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
21.11.2008, 22:04
Потоки можно создавать при инициализации dll
Цитата Сообщение от MSDN
During process startup and DLL initialization routines, new threads can be created, but they do not begin execution until DLL initialization is done for the process.
0
1 / 0 / 0
Регистрация: 16.05.2010
Сообщений: 36
06.12.2017, 00:13
столкнулся с тойже проблемой, кто нибудь знает решение?
0
Maniac
Эксперт С++
 Аватар для ISergey
1465 / 966 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
06.12.2017, 00:59
Цитата Сообщение от ixtor Посмотреть сообщение
столкнулся с тойже проблемой, кто нибудь знает решение?
Поток то можно создать, но это не рекомендуется так как есть небольшие грабли..
Dynamic-Link Library Best Practices
Call CreateThread. Creating a thread can work if you do not synchronize with other threads, but it is risky.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.12.2017, 00:59
Помогаю со студенческими работами здесь

Создание .dll и присоеденение .dll к проекту путем непосредственного написания кода
Здравствуйте, дорогие форумчане! Я прекрасно знаю, как создавать и прикреплять к проекту .dll файлы при помощи опций компилятора в Visual...

bass.dll Кодировка потока
Здравствуйте форумчане, есть вопрос по сабжу: Проблема с выводом название трека: - латиница грузится хорошо При ...

Реализовать два потока (Thread) в DLL
Всем привет. Есть необходимость создать dll и в нем реализовать 2 потока и что-то у меня не получается запустить проект :( файл...

Изменение частоты потока в BASS.DLL
Здравствуйте! Разбираюсь я с bass.dl, проигрываю файл таким кодом: procedure TForm1.Button1Click(Sender: TObject); begin ...

Перегрузка потока ввода вывода в dll
Доброго времени суток. Мне нужно создать dll, которая содержит экспортируемый класс для работы с рациональными числами. Сам класс...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru