0

rundll32で呼び出すことができる関数もエクスポートするexeを作成しようとしています。これは可能ですか?もしそうなら、なぜそれはこのように機能しないのですか?

私はこれに関するMicrosoftのアドバイスに厳密に従った。

#define RUNDLL32(func) extern "C" __declspec(dllexport) void CALLBACK func(HWND hWnd, HINSTANCE hInst, LPSTR lpszCmdLine, int nCmdShow)

RUNDLL32(MyFunc)
{
  MessageBox(0, 0, 0, 0);
}

しかし、

rundll32 myprog.exe,_MyFunc@16

rundll32がクラッシュ/DEPが起動します。

4

1 に答える 1

2

Rundll32.exeは、LoadLibrary()を使用して実行可能イメージをロードします。これはEXEの場合はうまく機能しない可能性があり、デフォルトではないアドレスにロードされることは想定されていません。これは確実に発生しますが、rundll32.exeはすでにそのデフォルトアドレスを使用しています。再配置レコードが省略されないように、リンカーをいじくり回すことができるかどうかはわかりません。

ただし、このアプローチを気にしないでください。EXEの代わりにDLLを作成するだけです。そして、実際の引数をMessageBox()に渡します。そして、はい、.defファイルを使用してエクスポートされた関数の名前を変更します。

于 2010-11-04T13:28:43.403 に答える