c++ - DllMain w/createthread 和 printf
问题描述
我正在尝试使用 mingw-64 构建一个 Windows dll,一旦加载,它就会开始无限地打印“Hello World”。
这是我的 dll.c
#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();
}
这是我的 dll.h:
#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
#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 时,我的控制台上什么也没有。怎么了?
解决方案
首先,我想提一下,在你的线程中实现这样一个繁忙的循环是不可取的。
至于您遇到的问题,这里有几个潜在的问题:
printf
是 CRT 函数,但是您调用的是CreateThread()
而不是beginthread(ex)
,因此 CRT 未正确初始化。- DLL 入口点是一个出了名的问题所在。您几乎不能从那里调用任何 kernel32 函数,更不用说 CRT 函数了(请参阅DllMain 入口点和动态链接库最佳实践)。
在大多数情况下,建议实现客户端在使用您的库时需要调用的单独函数Init
。Exit
推荐阅读
- excel-formula - 我想查找日期范围内的文本计数作为数组中的标准 1 和标准 2
- c - calloc时如何修复内存泄漏
- python - 为什么我不能在 VS - Python 中导入 turtle 或 turtle.Screen?
- c# - 等待/异步阻塞 UI
- c++ - 我应该为 C++ 中的每种类型都有一个解析器吗?
- angular6 - 在 Angular 5/6 的当前视图中检测子组件的父组件?
- python - 给定 p,k 从 n 中获胜的概率?
- mysql - 如何解决这个 SQL 查询 emp manager 关系
- c - EPS8266 和 STM32F4 上的安全 SSL
- signals - SENT 协议 CRC 计算