my_angel 发表于 2016-11-4 21:14:28

动态链接库中创建线程失败

本人菜菜鸟,想在动态链接库中创建线程,发现失败了。
请各位帮帮忙。。{:5_92:}

unsigned int __stdcall MyFunc(void *pParam)
{
    MessageBox(NULL, TEXT("启动线程成功!"), TEXT("提示"), MB_OK);
    return 0;
}

BOOL APIENTRY DllMain( HMODULE hModule,
                     DWORDul_reason_for_call,
                     LPVOID lpReserved
                     )
{


    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
      _beginthreadex(NULL, 0, MyFunc, NULL, 0, NULL);
      MessageBox(NULL, TEXT("成功载入动态链接库"), TEXT("提示"), MB_OK);
      break;

    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:

      break;

    case DLL_PROCESS_DETACH:
      MessageBox(NULL, TEXT("成功卸载动态链接库"), TEXT("提示"), MB_OK);
      break;
    }
    Sleep(1);
    return TRUE;
}

无符号整形 发表于 2016-11-4 21:14:29

本帖最后由 无符号整形 于 2016-11-5 08:37 编辑

my_angel 发表于 2016-11-5 08:31
啥意思?

我对这个最熟悉了,居然没召唤我~{:10_254:}@拈花小仙
#include <Windows.h>

HINSTANCE g_hModule;

DWORD WINAPI MyFunc(LPVOID pParam)
{
        MessageBox(NULL, TEXT("启动线程成功!"), TEXT("提示"), MB_OK);
        Sleep(2000);
        return 0;
}

BOOL APIENTRY DllMain(HMODULE hModule,
        DWORDul_reason_for_call,
        LPVOID lpReserved
        )
{

        DWORD ThreadID;
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
                g_hModule = hModule;
                if (CreateThread(NULL, 0, MyFunc, NULL, 0, &ThreadID) == NULL)
                {
                        MessageBox(NULL, TEXT("Error"), TEXT("提示"), MB_OK);
                }
                MessageBox(NULL, TEXT("成功载入动态链接库"), TEXT("提示"), MB_OK);
                break;

        case DLL_THREAD_ATTACH:
                MessageBox(NULL, TEXT("成功创建线程。"), TEXT("提示"), MB_OK);
                break;
        case DLL_THREAD_DETACH:
                MessageBox(NULL, TEXT("线程退出。"), TEXT("提示"), MB_OK);
                break;

        case DLL_PROCESS_DETACH:
                MessageBox(NULL, TEXT("成功卸载动态链接库"), TEXT("提示"), MB_OK);
                break;
        }
        return TRUE;
}

my_angel 发表于 2016-11-4 21:15:33

美女求帮忙 @拈花小仙

alltolove 发表于 2016-11-5 07:52:32

最后是不是应该return 0;吧{:5_94:}

my_angel 发表于 2016-11-5 08:31:33

alltolove 发表于 2016-11-5 07:52
最后是不是应该return 0;吧

啥意思?{:5_96:}

my_angel 发表于 2016-11-5 09:03:43

本帖最后由 my_angel 于 2016-11-5 09:10 编辑

无符号整形 发表于 2016-11-5 08:34
我对这个最熟悉了,居然没召唤我~@拈花小仙
#include <process.h>
#include <stdio.h>
#include <Windows.h>

unsigned int __stdcall MyFunc(void *arg)
{
    printf("+++++启动线程成功!++++\n");
    MessageBox(NULL, TEXT("启动线程成功!"), TEXT("提示"), MB_OK);
    return 0;
}

BOOL APIENTRY DllMain( HMODULE hModule,
                     DWORDul_reason_for_call,
                     LPVOID lpReserved
                     )
{
    switch(ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
      printf("===== 加载动态链接库,并创建子线程 =====\n");
      _beginthreadex(NULL, 0, MyFunc, NULL, 0, NULL);
      break;

    case DLL_PROCESS_DETACH:
      printf("===== 卸载动态链接库 =====\n");
      break;
    case DLL_THREAD_ATTACH:
      printf("===== DLL_THREAD_ATTACH 被触发 =====\n");
      break;
    case DLL_THREAD_DETACH:
      printf("===== DLL_THREAD_DETACH 被触发 =====\n");
      break;
    }
    return true;
}

把代码这样写就正常了,但是把子线程执行到MessageBox好像停住了,DLL_THREAD_DETACH也没有被触法,究竟啥回事,知道吗?

my_angel 发表于 2016-11-5 09:46:08

无符号整形 发表于 2016-11-5 08:34
我对这个最熟悉了,居然没召唤我~@拈花小仙

发现问题了, 原来是主线程关闭了,导致进程关闭,子线程还没执行完就被迫结束。

犯傻了。。。

分就给你了,谢谢啦
页: [1]
查看完整版本: 动态链接库中创建线程失败