【发布时间】: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。
-
非常感谢!那解决了它。我忘记了我第一次创建库时使用了公共语言运行时支持。