【问题标题】:Why does the window never show up, although all required functions are present?为什么窗口从不显示,尽管所有必需的功能都存在?
【发布时间】:2016-05-04 16:28:35
【问题描述】:

我一直在尝试制作一个通用 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;
};

【问题讨论】:

  • 先尝试一些更简单的方法,比如显示对话框,看看你的 DLL 是否正确加载。
  • 我知道DLL被注入了..
  • switch(WParameter){}; - 这就是您收到警告的原因。
  • 我意识到我只是想排除一切。谢谢!

标签: c++ windows forms winapi


【解决方案1】:

您可以查看此blog 以了解您的案例。

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

请注意,不建议从 DllMain 调用诸如 CreateThread 之类的 Windows API,请参阅here

【讨论】:

  • @Levi Branch,显然对此有不同的看法。博客示例是否解决了您的问题?
  • @TonPlooij:Dynamic-Link Library Best Practices 的措辞(“不应该 [...] 调用 CreateThread)是混乱的根源。这真正想说的是,DllMain 中的同步会导致死锁。当你创建一个线程时,你几乎总是实现某种同步。创建线程本身确实很好,因为您可以放心地假设 kernel32.dll 总是映射到正在运行的进程中。
  • @Ton Pooij 我还没有尝试过,但我怀疑它会。
  • @TonPlooij 我已经根据示例重写了我的代码,但仍然无济于事。更新了话题。
  • 我也忘了提及,但如果这有助于缩小问题范围,消息框会显示并且窗口不会显示。 @TonPlooij
猜你喜欢
  • 2015-01-04
  • 2019-04-13
  • 1970-01-01
  • 2021-02-15
  • 2016-02-17
  • 1970-01-01
  • 2015-10-25
  • 2014-08-06
  • 1970-01-01
相关资源
最近更新 更多