为什么尽管所有必需的功能都存在,但窗口始终不显示

Why does the window never show up, although all required functions are present?

本文关键字:存在 窗口 显示 功能 为什么      更新时间:2023-10-16

我一直在尝试制作一个通用DLL,以便将其注入进程&一扇窗户就会弹出。我拥有所有必需的函数,如WinMain(我将我的命名为Initiate并手动调用它)、DllWindowProcedure和DllMain。然而,经过编译,有一个警告,没有错误——我相信这是一个逻辑错误。如果你发现任何问题,或者我可以改进的地方,请告诉我!

警告:

1> Main.cpp(43):警告C4060:switch语句不包含"case"或"default"标签

代码:

#include <Windows.h>
HINSTANCE InjectedModuleHandle;
LRESULT CALLBACK DllWindowProcedure(HWND, UINT, WPARAM, LPARAM);
DWORD WINAPI DllThreadProcedure(void * Data)
{
    MessageBoxA(NULL, (LPCSTR)"Welcome to Flames v1.1!", (LPCSTR)"Startup Message", NULL);
    MSG Messages;
    WNDCLASSEX WindowClass;
    WindowClass.hInstance = InjectedModuleHandle;
    WindowClass.lpszClassName = L"DllWindowClass";
    WindowClass.lpfnWndProc = DllWindowProcedure;
    WindowClass.style = CS_DBLCLKS;
    WindowClass.cbSize = sizeof(WNDCLASSEX);
    WindowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    WindowClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    WindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    WindowClass.lpszMenuName = NULL;
    WindowClass.cbClsExtra = 0;
    WindowClass.cbWndExtra = 0;
    WindowClass.hbrBackground = (HBRUSH)RGB(255, 255, 255);
    RegisterClassEx(&WindowClass);
    HWND Window = CreateWindowEx(0, L"DllWindowClass", L"Flames v1.1 - By XenoSaga3000", (WS_SYSMENU | WS_MINIMIZEBOX), 200, 200, 500, 450, FindWindow(NULL, L"ROBLOX"), CreateMenu(), InjectedModuleHandle, NULL);
    ShowWindow(Window, SW_SHOWNORMAL);
    while (GetMessage(&Messages, NULL, 0, 0))
    {
        TranslateMessage(&Messages);
        DispatchMessage(&Messages);
    };
    return 1;
};
LRESULT CALLBACK DllWindowProcedure(HWND Window, UINT Message, WPARAM WParameter, LPARAM LParameter)
{
    switch (Message)
    {
        case WM_COMMAND:
            switch(WParameter)
            {
                //Check for commands here.
            };
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        break;
        default:
            return DefWindowProc(Window, Message, WParameter, LParameter);
    };
    return 0;
};
bool APIENTRY DllMain(HMODULE DllInstance, DWORD Reason, LPVOID Reserved)
{
    if(Reason == DLL_PROCESS_ATTACH)
    {
        InjectedModuleHandle = DllInstance;
        CreateThread(0, NULL, DllThreadProcedure, NULL, NULL, NULL);
    };
    return TRUE;
};

您可以在这个博客中查看您的案例示例。

区别之一是它使用DllMain提供的HINSTANCE作为窗口类的实例句柄。GetModuleHandle(NULL)返回调用进程的实例句柄,而不是DLL。

请注意,不建议使用Windows API调用,如从DllMain调用CreateThread,请参阅此处。