首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DllMain w/ create螺纹和printf

DllMain w/ create螺纹和printf
EN

Stack Overflow用户
提问于 2018-07-27 16:39:49
回答 2查看 1.1K关注 0票数 0

我正在尝试使用mingw-64构建一个windows dll,一旦加载,就会开始不确定地打印"Hello“。

这是我的dll.c

代码语言:javascript
复制
#include <stdio.h>
#include <windows.h>
#include "dll.h"
#include "main.h"

HINSTANCE hThisModule;


DWORD mainThread() {
    while(1) {
        printf("Hello world!");
    }
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
    static HANDLE hThread;
    hThisModule = hinstDLL;

    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            hThread = CreateThread(0, 0, mainThread, 0, 0, 0);
            break;

        case DLL_PROCESS_DETACH:
            break;

        case DLL_THREAD_ATTACH:
            break;

        case DLL_THREAD_DETACH:
            break;
    }

    return TRUE;
}

void dummy() {
    Hello();
}

这是我的丈夫

代码语言:javascript
复制
#ifndef DLL_H_
#define DLL_H_

#ifdef BUILD_DLL
/* DLL export */
#define EXPORT __declspec(dllexport)
#else
/* EXE import */
#define EXPORT __declspec(dllimport)
#endif

#endif /* DLL_H_ */

因此,我构建了一个简单的程序来加载我的DLL以查看它是否正常工作,如下所示: hello.cpp

代码语言:javascript
复制
#include <windows.h>
#include <iostream>

typedef int (__stdcall *f_funci)();

int main()
{
  HINSTANCE hGetProcIDDLL = LoadLibrary("./wow.dll");

  if (!hGetProcIDDLL) {
    std::cout << "could not load the dynamic library" << std::endl;
    return EXIT_FAILURE;
  }

  return EXIT_SUCCESS;
}

现在,当我将hello.cpp编译为hello.exe并将dll.c编译为wow.dll时,我的控制台上什么都没有。怎么了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-27 17:54:31

如前所述,您的mainThread函数有错误的签名。试着做这样的事情:

代码语言:javascript
复制
DWORD WINAPI mainThread(LPVOID lpParam)
{
    UNREFERENCED_PARAMETER(lpParam);
    while (1)
    {
        printf("Hello world!\n");
        Sleep(1000);
    }
    return 0;
}

这对我来说很好。我修改了您的.exe,以便您可以将.dll拖放到它上进行测试:

代码语言:javascript
复制
#include <windows.h>
#include <iostream>

int main(int argc, char *argv[])
{
    if (argc < 2)
    {
        std::cout << "drag drop dll over exe" << std::endl;
        std::cin.get();
        return EXIT_FAILURE;
    }

    HINSTANCE hGetProcIDDLL = LoadLibraryA(argv[1]);

    if (!hGetProcIDDLL)
    {
        std::cout << "could not load the dynamic library" << std::endl;
        std::cin.get();
        return EXIT_FAILURE;
    }

    std::cin.get();
    return EXIT_SUCCESS;
}
票数 0
EN

Stack Overflow用户

发布于 2018-07-27 17:12:48

首先,我想提到,在线程中实现这样一个繁忙的循环是不可取的。

关于您正在经历的问题,这里有几个潜在的问题:

  1. printf是一个CRT函数,但是您调用的是CreateThread()而不是beginthread(ex),因此没有正确初始化CRT。
  2. Dll入口点是出了名的问题所在。您很难从那里调用任何kernel32函数,更不用说CRT函数了(参见DllMain入口点动态链接库最佳实践)。

在大多数情况下,最好实现客户端在使用库时需要调用的单独的InitExit函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51562220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档