我正在尝试使用mingw-64构建一个windows dll,一旦加载,就会开始不确定地打印"Hello“。
这是我的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();
}这是我的丈夫
#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时,我的控制台上什么都没有。怎么了?
发布于 2018-07-27 17:54:31
如前所述,您的mainThread函数有错误的签名。试着做这样的事情:
DWORD WINAPI mainThread(LPVOID lpParam)
{
UNREFERENCED_PARAMETER(lpParam);
while (1)
{
printf("Hello world!\n");
Sleep(1000);
}
return 0;
}这对我来说很好。我修改了您的.exe,以便您可以将.dll拖放到它上进行测试:
#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;
}发布于 2018-07-27 17:12:48
首先,我想提到,在线程中实现这样一个繁忙的循环是不可取的。
关于您正在经历的问题,这里有几个潜在的问题:
printf是一个CRT函数,但是您调用的是CreateThread()而不是beginthread(ex),因此没有正确初始化CRT。在大多数情况下,最好实现客户端在使用库时需要调用的单独的Init和Exit函数。
https://stackoverflow.com/questions/51562220
复制相似问题