【发布时间】:2019-04-15 14:05:09
【问题描述】:
所以我试图在 c++ 中创建一个 dll,它会在将表单注入进程时打开一个表单。
这是我拥有的代码(与为表单生成的文件分开的文件):
#include "Main.h"
#include <Windows.h>
using namespace::System;
using namespace::System::Windows::Forms;
auto FormRender(void) -> void {
Hyperscanner::Main lpMain;
lpMain.ShowDialog();
return;
}
HANDLE g_Thread = nullptr;
auto __stdcall DllMain(HMODULE hMod, DWORD dwReason, void* lpReserved) -> int {
if (dwReason) {
g_Thread = CreateThread(nullptr, 0, reinterpret_cast<LPTHREAD_START_ROUTINE>
(FormRender), nullptr, 0, nullptr);
}
if (!dwReason) {
TerminateThread(g_Thread, 0);
CloseHandle(g_Thread);
FreeLibraryAndExitThread(hMod, 0);
}
return true;
}
问题在于,由于某种原因,当我将其注入进程时,它会不断创建表单,就像线程中有一个循环一样,但您可以看到没有一个循环。当我尝试正常调用它时,没有线程,它根本不会出现,这没有意义,因为它在技术上与线程内部的相同。
我想知道我做错了什么并且可以使用帮助。谢谢!
解决方案(@hacksalot):
问题是启动了很多线程,这些线程会通过我的 DllMain 回调,所以它会启动一堆线程(由于某种原因没有考虑检查创建了多少线程)。
为了解决这个问题,我添加了一个全局变量以确保它只执行一次。
#include "Main.h"
#include <Windows.h>
using namespace::System;
using namespace::System::Windows::Forms;
volatile int g_StartOnce = 0;
auto FormRender(void) -> void {
Hyperscanner::Main lpMain;
lpMain.ShowDialog();
return;
}
auto StartRenderThread(HANDLE& ThreadHandle) -> bool {
ThreadHandle = CreateThread(nullptr, 0, reinterpret_cast<LPTHREAD_START_ROUTINE>
(FormRender), nullptr, 0, nullptr);
if (ThreadHandle)
{
return true;
}
return false;
}
auto StopRenderThread(HANDLE& ThreadHandle) -> bool {
if (ThreadHandle) {
if (TerminateThread(ThreadHandle, 0)) {
CloseHandle(ThreadHandle);
return true;
}
}
return false;
}
HANDLE g_Thread = nullptr;
auto __stdcall DllMain(HMODULE hMod, DWORD dwReason, void* lpReserved) -> int {
if (dwReason && !g_StartOnce) {
StartRenderThread(g_Thread);
++g_StartOnce;
}
if (!dwReason) {
StopRenderThread(g_Thread);
FreeLibraryAndExitThread(hMod, 0);
}
return true;
}
【问题讨论】: