【问题标题】:Why rundll gives missing entry? [duplicate]为什么rundll会丢失条目? [复制]
【发布时间】:2014-07-26 11:23:50
【问题描述】:

我在 Visual Studio 2010 中创建了一个非常简单的 DLL,一个 DLL 类型的 win32 项目。

然后我将 DllMain 更改为:

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        MessageBox(0,L"Hey there!",0,0);
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

我使用rundll32 vahid-win32.dll,dllmain 运行它。消息框显示,但之后它给出了

vahid-win32.dll 中的错误

缺少条目:dllmain

我的 DLL 有什么问题?还是和我一起? :-)

提前致谢

【问题讨论】:

  • 致未来读者:我在 Windows XP (SP3) 上尝试这个,对我来说,我什至无法得到弹出窗口(即消息框)但是对第一行: BOOL APIENTRY DllMain(...) to extern "C" BOOL APIENTRY DllMain(...) 帮助(注意,对我来说,它并没有解决整个“事情”之后弹出的错误,所以未来的读者应该关注@Haja Maideen 下面提供的答案)我只是注意到这一点是为了帮助未来的用户,这可能很有用。 (希望)编辑:如果这在某种程度上是错误的,如果有人指出这一点,我将不胜感激!谢谢。
  • 改进的评论:忽略我上面的评论,谢谢:(我没有大小来发布这个)而不是只有 extern "C" 然后 BOOL APIENTRY ... 像这样:extern "C" _declspec(dllexport) BOOL APIENTRY ...(就像下面的@Haja Maideen 所说)这(对我来说,在 Windows XP sp3 上)修复了任何错误消息,并加载了消息框。 (我做到了:在提升的 cmd 中:rundll32.exe "thedllfile.dll", mydllmain)如果这在某种程度上是错误的,如果有人指出这一点,我将不胜感激!谢谢。

标签: c++ winapi dll


【解决方案1】:

您的消息框并非来自您传递 DllMain 函数名称。而是自动调用它。但是 Rundll32 正在寻找一个名为 DllMain 的导出函数,其 dllexport 声明如下所示。

BOOL APIENTRY DllMain( HMODULE hModule,
                   DWORD  ul_reason_for_call,
                   LPVOID lpReserved
                 )
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
    MessageBox(0,L"Hey there!",0,0);
    break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
    break;
}
return TRUE;
}

extern "C" __declspec(dllexport) void mydllmain()
{
   MessageBox(0,L"Hey there again!",0,0);
}

当您使用参数 mydllmain 调用 RunDll32 时,我会同时给出两个消息框而不会出错。

【讨论】:

    【解决方案2】:

    没有理由通过RunDLL 调用DllMain,它会在加载DLL 时自动调用。 而是尝试运行自定义函数。 除此之外,问题可能是导出的名称。您需要为 DLL 编写一个 .def 文件。

    DllMain 它总是自动引起的。它通过rundll32引起,它会引起,为此它是“入口点”,你反复尝试引起它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-27
      • 1970-01-01
      • 2019-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多