有没有人有一个将完整的 WIN32 Windows 应用程序构建为 dll 的示例?
我想导出一个函数,通过 rundll32 调用它,并拥有一个完整的 Windows 应用程序,其中包含装饰、菜单、加速器和弹出的所有内容。
我知道rundll32的调用约定:
void CALLBACK TestEntryW(HWND hWnd, HINSTANCE hInst, LPWSTR pszCmdLine, int nCmdShow);
我可以通过以下命令从该函数中提取一个 MessageBox:rundll32.exe test3.dll,TestEntry other params and args
我可以通过获取 DLL 的句柄并在我的调用中GetModuleHandle("test3.dll")
使用它来从我的 DLL 加载资源。这似乎也适用,但我还没有工作(婴儿步骤..)。hInst
LoadString
LoadIcon
LoadAccelerators
我可以通过使用这些字符串和图标来注册一个 Windows 类RegisterClassEx
,但我必须使用父类hInst
,否则我ERROR_CANNOT_FIND_WND_CLASS
在调用CreateWindow
. 我认为这是预期的。
但是,当我尝试在 中使用该类时CreateWindow
,它返回 NULL,而GetLastError
.
我可以检索使用从 rundll32 传递的 hInst 的窗口类GetWindowsLong(hWnd, GWL_ATOM)
。将它用于 lpClassName,我可以拉出一个没有菜单和加速器的装饰窗口,但它有点时髦,因为 rundll 的窗口类通常只用于它的消息队列。我尝试使用子类化窗口SetWindowsLong
来替换WndProc
和调用CallWindowProc
而不是DefWindowProc
在我的 dll 中WndProc
。
由于无法在 MSVC++ 2010 Express 中调试它,我受到了阻碍。我用适当的条目替换了项目的命令和命令参数,因此它可以正确启动它,但它抱怨没有 rundll32.exe 的调试信息,并且断点等不起作用。
有任何想法吗?我在正确的轨道上吗?