【问题标题】:C++ Loader Lock ErrorC++ 加载程序锁定错误
【发布时间】:2013-03-31 17:33:20
【问题描述】:

我正在编写\编译一个(当前)只导出一个空白函数的 DLL。源代码:

DLLMain.cpp-

LIBRARYEXPORT LRESULT CALLBACK KeyboardProc(
int code,
WPARAM wParam,
LPARAM lParam
){



    return 0;


} 

到目前为止一切正常,这是我的 DLLMain.h-

using namespace std;

#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>
#define LIBRARYEXPORT __declspec(dllexport)



LIBRARYEXPORT LRESULT CALLBACK KeyboardProc(
    int code,
    WPARAM wParam,
    LPARAM lParam
);

我打算使用这个 DLL 和 windows 挂钩来检测按键,但是当我从一个单独的可执行文件调用 LoadLibrary 时,它返回一个运行时错误说

“DLL 'C:\Users\Orin\Documents\Visual Studio 2010\Projects\winmain\Debug\winmain.dll' 正在尝试在 OS Loader 锁内进行托管执行。不要尝试在 DllMain 或映像中运行托管代码初始化函数,因为这样做会导致应用程序挂起。”

这很好,但问题是:我的 KeyboardProc 函数中根本没有运行任何代码,我什至没有 DllMain 例程

我已经尝试过(但没有奏效):

  • 在项目属性中禁用 CLR
  • 删除我的“DllMain”例程
  • 在声明函数时使用“#pragma unmanaged”

非常感谢您的建议和cmets!

【问题讨论】:

  • Debug + Exceptions,展开“Managed Debugging Assistants”节点,取消勾选LoaderLock。
  • @HansPassant 我试过了,然后它出现一个运行时错误,说我试图在本机代码初始化期间运行 MSIL 代码。 :-/
  • 很明显你做错了什么,完全不清楚那可能是什么。重新开始,这次从 CLR 节点选择项目模板。使用“Win32 项目”模板创建非托管 DLL。
  • 非常感谢!那解决了它。我忘记了我第一次创建库时使用了公共语言运行时支持。

标签: c++ dll hook


【解决方案1】:

找到答案:

使用 Visual Studio 时,不得选择 CLR 库项目。而是使用“Win32 项目”模板。我不敢相信我错过了!

【讨论】:

    猜你喜欢
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多