Anonymous
Как создать рабочую ветку внутри DLL?
Сообщение
Anonymous » 05 июн 2025, 16:13
Я бы хотел написать C ++ clr dll , который создает поток, который делает что -то самостоятельно. DLL загружается и поддерживается дымом "Classic" C ++ win Приложение. Вот код DLL: < /p>
Код: Выделить всё
#include
#include "MyOutputWnd.h"
#pragma unmanaged
#pragma comment(lib, "user32.lib")
#using
#using
#using
using namespace System;
using namespace System::Drawing;
using namespace System::Windows::Forms;
#include
extern void ShowForm(void);
HANDLE hThread = NULL;
::BOOL WINAPI DllWork(__in::HMODULE hModule) {
MessageBoxA(NULL, "DllWork thread", "Msg title", MB_OK | MB_ICONQUESTION);
//ShowForm();
return true;
}
DWORD WINAPI CreateMessageBox(LPVOID lpParam) {
MessageBoxA(NULL, (char*)lpParam, "The thread", MB_OK);
return 0;
}
::BOOL WINAPI DllMain(
__in::HMODULE hinstDLL, // handle to DLL module
__in::DWORD fdwReason, // reason for calling function
__in __reserved::LPVOID lpvReserved) // reserved
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
/*char buffer[100];
sprintf_s(buffer, "DllMain%s\n", "I can inject things");
OutputDebugStringA(buffer);*/
if ((hThread = CreateThread(NULL, 0, &CreateMessageBox, "Hello World", 0, NULL)) == NULL) {
MessageBoxA(NULL, "CreateThread failed!", "Msg title", MB_OK | MB_ICONQUESTION);
return FALSE;
}
MessageBoxA(NULL, "CreateThread OK!", "Msg title", MB_OK | MB_ICONQUESTION);
break;
case DLL_THREAD_ATTACH:
// Do thread-specific initialization.
break;
case DLL_THREAD_DETACH:
// Do thread-specific cleanup.
break;
case DLL_PROCESS_DETACH:
if (lpvReserved != nullptr)
{
if (::CloseHandle(hThread) == FALSE) {
MessageBoxA(NULL, "CloseHandle(hThread) failed!", "Msg title", MB_OK | MB_ICONQUESTION);
}
else
{
MessageBoxA(NULL, "CloseHandle(hThread) OK!", "Msg title", MB_OK | MB_ICONQUESTION);
}
break; // do not do cleanup if process termination scenario
}
// Perform any necessary cleanup.
break;
}
return TRUE; // Successful DLL_PROCESS_ATTACH.
}
и C ++ Приложение Код запуск библиотеки так же просто, как:
Код: Выделить всё
#include
#include
#include
#include
#include
#include
#include
#include
typedef int(__stdcall* f_funci)();
int main()
{
HINSTANCE hGetProcIDDLL = LoadLibrary(L"D:/Projects/Project3/Debug/Project3.dll");
if (!hGetProcIDDLL) {
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79654529/how-to-create-a-working-thread-inside-a-dll[/url]
1749129231
Anonymous
Я бы хотел написать C ++ clr dll , который создает поток, который делает что -то самостоятельно. DLL загружается и поддерживается дымом "Classic" C ++ win Приложение. Вот код DLL: < /p> [code]#include #include "MyOutputWnd.h" #pragma unmanaged #pragma comment(lib, "user32.lib") #using #using #using using namespace System; using namespace System::Drawing; using namespace System::Windows::Forms; #include extern void ShowForm(void); HANDLE hThread = NULL; ::BOOL WINAPI DllWork(__in::HMODULE hModule) { MessageBoxA(NULL, "DllWork thread", "Msg title", MB_OK | MB_ICONQUESTION); //ShowForm(); return true; } DWORD WINAPI CreateMessageBox(LPVOID lpParam) { MessageBoxA(NULL, (char*)lpParam, "The thread", MB_OK); return 0; } ::BOOL WINAPI DllMain( __in::HMODULE hinstDLL, // handle to DLL module __in::DWORD fdwReason, // reason for calling function __in __reserved::LPVOID lpvReserved) // reserved { switch (fdwReason) { case DLL_PROCESS_ATTACH: /*char buffer[100]; sprintf_s(buffer, "DllMain%s\n", "I can inject things"); OutputDebugStringA(buffer);*/ if ((hThread = CreateThread(NULL, 0, &CreateMessageBox, "Hello World", 0, NULL)) == NULL) { MessageBoxA(NULL, "CreateThread failed!", "Msg title", MB_OK | MB_ICONQUESTION); return FALSE; } MessageBoxA(NULL, "CreateThread OK!", "Msg title", MB_OK | MB_ICONQUESTION); break; case DLL_THREAD_ATTACH: // Do thread-specific initialization. break; case DLL_THREAD_DETACH: // Do thread-specific cleanup. break; case DLL_PROCESS_DETACH: if (lpvReserved != nullptr) { if (::CloseHandle(hThread) == FALSE) { MessageBoxA(NULL, "CloseHandle(hThread) failed!", "Msg title", MB_OK | MB_ICONQUESTION); } else { MessageBoxA(NULL, "CloseHandle(hThread) OK!", "Msg title", MB_OK | MB_ICONQUESTION); } break; // do not do cleanup if process termination scenario } // Perform any necessary cleanup. break; } return TRUE; // Successful DLL_PROCESS_ATTACH. } [/code] и C ++ Приложение Код запуск библиотеки так же просто, как: [code]#include #include #include #include #include #include #include #include typedef int(__stdcall* f_funci)(); int main() { HINSTANCE hGetProcIDDLL = LoadLibrary(L"D:/Projects/Project3/Debug/Project3.dll"); if (!hGetProcIDDLL) { std::cout Подробнее здесь: [url]https://stackoverflow.com/questions/79654529/how-to-create-a-working-thread-inside-a-dll[/url]