C++ LoadLibraryW返回nullptr,GetLastError()返回322225619
描述我一直遇到的问题可能需要很长时间,但最尖锐的问题是:C++ LoadLibraryW返回nullptr,GetLastError()返回322225619,c++,dll,loadlibrary,C++,Dll,Loadlibrary,描述我一直遇到的问题可能需要很长时间,但最尖锐的问题是: 当给定有效路径时,LoadLibraryW失败(返回nullptr) Process Monitor不会记录任何可疑的故障,或者与成功加载dll(它可以在另一个上下文中加载dll)时记录任何不同的内容 dll没有非系统依赖项 …最糟糕的是,GetLastError返回的Windows错误代码是322225619 假设3221225619不是一个有效的错误代码,那么会有什么问题导致Windows甚至没有错误代码 编辑: 我想有些人想要更多关
- 它似乎不是输入-在工作版本和故障版本中是相同的,并且当输入字符串被破坏时,LoadLibraryW已成功声明“文件不存在”。当前输入已硬编码,几乎没有出错的余地
- dll在版本中编译,调用代码在调试中编译。我已经这样做了18个月,没有任何问题,但你永远不知道
- Process Monitor包报告在LoadLibraryW中运行的大约30个内部操作,包括CreateFile、LoadImage、RegOpenKey。对于工作调用和失败调用,它们是相同的,具体到文件大小和内存位置
- 在调用C++对象时没有明显的内存损坏,正如我所说的,过程监视器在两种情况下都给出相同的基本图像地址。
- 失败是100%一致的-每次都在同一时间,同一地点
我对它进行了重构,以便在构建过程中加载dll,但仅在运行时从中提取函数。这显然有效,而且可能是一种更好的方法(在构建过程中加载dll,在销毁过程中释放dll)。由于在构造和第一次调用dll之间几乎没有什么进展,我不明白为什么一个方法会产生操作系统错误,而另一个不会。正在加载的库的DllMain上有什么内容?我只是直接从可执行文件中调用它。顺便说一句,如果我正确地解析了它,error\u is\u JOIN\u PATH是您的特定错误,关键是:“没有足够的资源来处理这个命令”。两个严重性位均点亮,表示完全错误,设备代码为facility_NULL,表示基本操作系统错误。这并不是说这对你有多大帮助,但至少你现在知道了。(虽然我可以发誓一个顶部有0xC000的0x93是一个无效的内核句柄,但这么长时间以来我可能错了)。@WhozCraig现在你是怎么做到的?我所能找到的只是异常\u FLT\u UNDERFLOW,这在它试图加载dll(可能正在运行)时没有多大意义。你能把这句话作为一个完整的答案吗?我没想到有人能从我提供的信息中解决我的问题-我只是想知道如何解释错误代码…@MikeSadler如果它是一种标准的HRESULT格式(这似乎是合理的),前两位是严重性代码(两个设置都不好,顺便说一句),然后是其他内容的两位,然后是12位设备代码,最后是16位错误值。所有这些,打开winerror.h并开始搜索。这可能是一个无效的内核句柄错误,但这将是一种奇怪的报告方式。