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

0

Я попытался подключить функцию 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-С++ (не GUI). Пожалуйста, помогите мне решить эту проблему. Во всяком случае, поправьте меня.

  • 0
    какое значение имеет C_thread ? «Останавливается» ли он молча, какое-либо исключение, что говорит отладчик?
  • 0
    Пока запускается программа, до C_thread () она выдаёт вывод. Затем он показывает, что Windows останавливает диалоговое окно программы. В отладке, это дает ниже ошибку. Необработанное исключение в 0xa3004262 в testcall.exe: 0xC0000005: Место чтения нарушения доступа 0xa3004262.
Теги:
dll
runtime-error
hook

1 ответ

0
Лучший ответ

Ваша программа имеет неопределенное поведение. При создании потока не гарантируется, что он запускается немедленно. Даже если он работает сразу, у вас есть условие гонки между FreeLibrary и 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
    Благодарю. Это работает сейчас. На самом деле, то, что вы упомянули, было также одной из моих ошибок. Большое спасибо ..

Ещё вопросы

Сообщество Overcoder
Наверх
Меню