Как мне решить эту ошибку во время выполнения?

Я пытался перехватить CreateThread () функция с помощью библиотеки Detour. Но это не сработает из-за некоторых ошибок. Наконец, просто вызовите функцию CreateThread, а не прямой вызов, я создаю свою собственную DLL. Во время построения DLL и компиляции программы. Он не возвращает никакой ошибки. Но во время запуска получает стоп.

testdll.cpp


#include <windows.h>

BOOL _stdcall DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
return TRUE;
}

extern "C" _declspec(dllexport) bool _stdcall C_thread(LPSECURITY_ATTRIBUTES lpThreadAttributes,SIZE_T dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId)
{
HANDLE hThread;
DWORD threadID;
hThread = CreateThread(lpThreadAttributes,dwStackSize,lpStartAddress,lpParameter,dwCreationFlags,lpThreadId);
return hThread;
}

используя выше testdll.cpp, я создаю DLL.

cl / nologo / W3 / Ox / Zi / MD / LD test.cpp

link / DEBUG / SUBSYSTEM: WINDOWS / ENTRY: DllMain /OUT:testdll_temp.dll /DEF:test.def testdll_temp.obj kernel32.lib

testcall.cpp // * основная программа * //


#include<stdio.h>
#include<windows.h>

DWORD WINAPI ThreadFun(LPVOID param)
{
printf("hi");
return 0;
}

int main()
{
HANDLE h;
DWORD threadID;
typedef bool (_stdcall *CALL_A)(LPSECURITY_ATTRIBUTES lpThreadAttributes,SIZE_T dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId);
printf("Creating Handle");
HINSTANCE hinstDLL;
BOOL fFreeDLL;

printf("\nLoading library test.dll .... ");

hinstDLL = LoadLibrary("testdll.dll");
if (hinstDLL != NULL)
{
printf("\nLibrary loaded\n");
CALL_A C_thread;
C_thread = (CALL_A)GetProcAddress(hinstDLL,"C_thread");
if (C_thread != NULL)
{
printf("lets see, it calling");
HANDLE a = C_thread(NULL, 0, ThreadFu, NULL, 0, &threadID);
printf("working");
}
else
{
printf("Address not found ");
}
fFreeDLL = FreeLibrary(hinstDLL);
}
else
printf("Library not found");
return 0;
}

Даже я это скомпилировал,
cl / Zi testcall.cpp

Но я запускаю файл testcall.exe.
Библиотека была загружена правильно, но при выполнении ниже строки она остановилась.

HANDLE a = C_thread (NULL, 0, ThreadFu, NULL, 0, &ThreadId);

Я использую командную строку Visual-C ++ (не графический интерфейс).
Пожалуйста, помогите мне решить это.
Если что, поправьте меня.

0

Решение

Ваша программа имеет неопределенное поведение. При создании потока не гарантируется, что он запускается немедленно. Даже если он запускается сразу, у вас есть состояние гонки между FreeLibraryи вызов во время выполнения printf в теме.

Ваш основной поток должен дождаться завершения вторичного потока:

    CALL_A C_thread;
C_thread = (CALL_A)GetProcAddress(hinstDLL,"C_thread");

if (C_thread != NULL)
{
printf("lets see, it calling");
HANDLE a = C_thread(NULL, 0, ThreadFu, NULL, 0, &threadID);
printf("working");

if (WaitForSingleObject(a, some_time_or_infinite) != WAIT_OBJECT_0)
{
// this is dirty since the thread has probable no chance to release resources.
TerminateThread(hThread);
}
}
else
{
printf("Address not found ");
}

fFreeDLL = FreeLibrary(hinstDLL);
0

Другие решения

Других решений пока нет …