鱼C论坛

 找回密码
 立即注册
查看: 3351|回复: 6

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

[复制链接]
发表于 2016-11-4 21:14:28 | 显示全部楼层 |阅读模式
15鱼币
本人菜菜鸟,想在动态链接库中创建线程,发现失败了。
请各位帮帮忙。。
unsigned int __stdcall MyFunc(void *pParam)
{
    MessageBox(NULL, TEXT("启动线程成功!"), TEXT("提示"), MB_OK);
    return 0;
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_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;
}

最佳答案

查看完整内容

我对这个最熟悉了,居然没召唤我~@拈花小仙
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-4 21:14:29 | 显示全部楼层
本帖最后由 无符号整形 于 2016-11-5 08:37 编辑


我对这个最熟悉了,居然没召唤我~@拈花小仙
#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,
        DWORD  ul_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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-11-4 21:15:33 | 显示全部楼层
美女求帮忙 @拈花小仙
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-5 07:52:32 | 显示全部楼层
最后是不是应该return 0;吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-11-5 08:31:33 | 显示全部楼层
alltolove 发表于 2016-11-5 07:52
最后是不是应该return 0;吧

啥意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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,
                       DWORD  ul_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也没有被触法,究竟啥回事,知道吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-11-5 09:46:08 | 显示全部楼层
无符号整形 发表于 2016-11-5 08:34
我对这个最熟悉了,居然没召唤我~@拈花小仙

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

犯傻了。。。

分就给你了,谢谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 06:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表