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失败(返回nullptr)

  • Process Monitor不会记录任何可疑的故障,或者与成功加载dll(它可以在另一个上下文中加载dll)时记录任何不同的内容

  • dll没有非系统依赖项

  • …最糟糕的是,GetLastError返回的Windows错误代码是322225619

  • 假设3221225619不是一个有效的错误代码,那么会有什么问题导致Windows甚至没有错误代码

    编辑:

    我想有些人想要更多关于失败本身的细节:

    • 它似乎不是输入-在工作版本和故障版本中是相同的,并且当输入字符串被破坏时,LoadLibraryW已成功声明“文件不存在”。当前输入已硬编码,几乎没有出错的余地
    • dll在版本中编译,调用代码在调试中编译。我已经这样做了18个月,没有任何问题,但你永远不知道
    • Process Monitor包报告在LoadLibraryW中运行的大约30个内部操作,包括CreateFile、LoadImage、RegOpenKey。对于工作调用和失败调用,它们是相同的,具体到文件大小和内存位置
    • 在调用C++对象时没有明显的内存损坏,正如我所说的,过程监视器在两种情况下都给出相同的基本图像地址。
    • 失败是100%一致的-每次都在同一时间,同一地点
    抱歉,这不是确切的答案,但问题已经解决

    首先,我注意到了一个类似的问题:。我认为这本书提供了更多的细节,如果你的处境与我相似,那么值得一看

    我要感谢@WhozCraig、@DanielDaranas和所有发表了有益评论的人。对于阅读本文的其他人来说,有一篇关于HRESULT的好文章扩展了他们在维基百科上的观点:

    就我而言,这个问题已经像它出现一样神秘地消失了。我创建了一个C++类来定期调用DLL。我最初的工作是在第一次调用之前立即加载dll,并将其缓存在内存中。这与一年多以来的工作原理是一样的。这导致了上述神秘的错误


    我对它进行了重构,以便在构建过程中加载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并开始搜索。这可能是一个无效的内核句柄错误,但这将是一种奇怪的报告方式。