Windows有一个名为rundll32.exe的实用程序,可以将本机动态链接库作为应用程序执行.
假设我有一段打印"Hello World!"的代码.到控制台.是否可以用C++(最好是Visual C++)编写一个可以使用rundll32.exe执行的库并运行这段代码?如果是这样,怎么样?
谷歌搜索"rundll32",第三次点击是文档的链接,
http://support.microsoft.com/kb/164787
根据该文档,rundll32调用具有签名的用户指定函数wWinMain(除了这里的第一个参数是窗口句柄而不是实例句柄),
void CALLBACK
EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
Run Code Online (Sandbox Code Playgroud)
所以,试试这个:
// File [foo.def]
EXPORTS
sayHello
Run Code Online (Sandbox Code Playgroud)
// File [foo.cpp]
#include <iostream>
namespace myCode {
void sayHello()
{
using namespace std;
cout << "Hello, world!" << endl;
}
} // namespace myCode
#undef UNICODE
#define UNICODE
#include <windows.h>
extern "C"
__declspec( dllexport )
void CALLBACK sayHello( HWND, HINSTANCE, wchar_t const*, int )
{
AllocConsole();
freopen( "CONIN$", "r", stdin );
freopen( "CONOUT$", "w", stdout );
freopen( "CONOUT$", "w", stderr );
DWORD const infoBoxOptions = MB_ICONINFORMATION | MB_SETFOREGROUND;
MessageBox( 0, L"Before call...", L"DLL message:", infoBoxOptions );
myCode::sayHello();
MessageBox( 0, L"After call...", L"DLL message:", infoBoxOptions );
}
Run Code Online (Sandbox Code Playgroud)
建设和运营:
[d:\dev\test] > cl foo.cpp foo.def user32.lib /MD /LD /D _CRT_SECURE_NO_WARNINGS foo.cpp Creating library foo.lib and object foo.exp [d:\dev\test] > rundll32 foo.dll,sayHello [d:\dev\test] > _
输出显示在自己的控制台窗口中,通过创建AllocConsole,这通常是必需的,因为rundll32是一个GUI子系统程序(这也是freopen调用的原因).
要在现有控制台窗口中显示输出,可以省略对AllocConsole和的调用freopen,并将标准输出重定向rundll32到管道.例如,more当输出只有几行时,标准输出可以通过Windows传输;或者通过某些*nix-utility cat可以传输更多行.但是,在标准命令解释程序[cmd.exe]中,它只能将输出重定向到con.