通过rundll32在dll中运行完整的Windows应用程序

时间:2012-08-10 20:07:51

标签: windows visual-studio-2010 createwindow rundll32

有没有人有一个将完整的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

我可以通过GetModuleHandle("test3.dll")获取DLL的句柄并在我的hInst调用中将其用作LoadString来从我的DLL加载资源。这似乎也适用于LoadIconLoadAccelerators,但我还没有工作(宝贝步骤......)。

我可以使用这些字符串和图标通过RegisterClassEx注册Windows课程,但我必须使用父hInst或在调用ERROR_CANNOT_FIND_WND_CLASS时获得CreateWindow。我认为这是预期的。

但是,当我尝试在CreateWindow中使用该类时,它返回NULL,GetLastError也是如此。

我可以使用GetWindowsLong(hWnd, GWL_ATOM)检索从rundll32传递的hInst的窗口类。使用lpClassName,我可以拉出一个装饰窗口减去菜单和加速器,但它有点时髦,因为rundll的窗口类通常只用于它的消息队列。我尝试使用SetWindowsLong对窗口进行子类化,以替换WndProc并在我的dll的CallWindowProc中调用DefWindowProc而不是WndProc

由于无法在MSVC ++ 2010 Express中调试它而受到阻碍。我用适当的条目替换了项目的命令和命令参数,因此它正确启动它,但它抱怨没有rundll32.exe的调试信息,断点等不起作用。

有什么想法吗?我是在正确的轨道上吗?

0 个答案:

没有答案