谷歌搜索“rundll32”,第三次点击是文档链接,
http://support.microsoft.com/kb/164787
根据该文档,rundll32 调用用户指定的函数,其签名类似于wWinMain(除了这里的第一个参数是窗口句柄而不是实例句柄),
void CALLBACK
EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
所以,试试这个:
// File [foo.def]
EXPORTS
sayHello
// 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 );
}
构建和运行:
[d:\开发\测试]
> cl foo.cpp foo.def user32.lib /MD /LD /D _CRT_SECURE_NO_WARNINGS
foo.cpp
创建库 foo.lib 和对象 foo.exp
[d:\开发\测试]
> rundll32 foo.dll,sayHello
[d:\开发\测试]
> _
输出显示在它自己的控制台窗口中,通过AllocConsole 创建,这通常是必要的,因为rundll32 是一个GUI 子系统程序(这也是freopen 调用的原因)。
要在现有控制台窗口中显示输出,只需省略对AllocConsole 和freopen 的调用,并将rundll32 的标准输出重定向到管道。例如。当输出只有几行时,标准输出可以通过 Windows 的more 传递,或者通过一些 *nix-utility cat 传递更多行。但是,在标准命令解释器 [cmd.exe] 中,仅将输出重定向到 con 是行不通的。