4

我的 C++ 应用程序的一个 DLL 中出现了非常奇怪的行为。它可以正常工作并加载,直到我在 DLL 的主文件中使用 #include 包含单个文件。然后我收到此错误消息:

从 D:/Targets/bin/MatrixWorkset.dll 加载组件 无法加载“D:/Targets/bin/MatrixWorkset.dll”:无法加载库 MatrixWorkset:对内存位置的访问无效。

现在我已经搜索并搜索了代码和谷歌,我无法弄清楚发生了什么。到目前为止,一切都在一个 DLL 中,我决定将它分成两个较小的。导致问题的文件是另一个第二个库的一部分(加载正常)。

任何想法都将不胜感激。谢谢, 雅科

4

6 回答 6

6

可能的原因是具有类类型的全局。构造函数从 运行DllMain(),然后DllMain()LoadLibrary()返回之前运行。DllMain()在返回之前,您可以做的事情有很多限制。

于 2009-04-02T13:55:41.377 回答
2

标头是否可能在某处包含 #pragma comment(lib,"somelibrary.lib") 语句?如果是这样,它会自动尝试导入库。

为了解决这个问题,我首先使用depends(http://www.dependencywalker.com/)查看二进制文件,看看是否有任何你不期望的DLL依赖项。如果你确实找到了一些东西并且你在 Visual Studio 中,你应该在链接器上打开“显示进度”AKA /VERBOSE。

由于您获得了对内存位置的无效访问,因此 DLLMAIN 中可能存在某些内容或某些静态初始化程序正在崩溃。你能简化 MatrixWorkset.dll(假设你写的)吗?

于 2009-04-02T12:45:59.097 回答
0

The error you describe sounds like a run-time error. Is this error displayed automatically by windows or is it one that your program emits?

I say attach a debugger to your application and trace where this error is coming from. Is Windows failing to load a dependency? Is your library somehow failing on load-up?

If you want to rule in/out this header file you're including, try pre-compiling your main source file both with and without this #include and diff the two results.

于 2009-04-02T18:15:34.677 回答
0

我还是没搞定。让我回答一些被问到的问题:

1) Windows 没有加载依赖项,我认为因为 Dependency Walker 显示一切正常。2) 我附加了一个调试器,它在尝试加载 MatrixWorkset.dll 时基本上会打印以下内容:

            10:04:19.234
stdout:&"警告:从 D:/ScinericSoftware/VisualWorkspace/trunk/Targets/bin/MatrixWorkset.dll 加载组件\n"
            10:04:19.234
标准输出:&"\n"
状态:已停止:“收到信号”
状态:停止。
            10:04:19.890
stdout:30*stopped,reason="signal-received",signal-name="SIGSEGV",signal-meaning="Segmentation fault",thread-id="1",frame={addr="0x7c919994",func= "towlower",args=[],from="C:\\WINDOWS\\system32\\ntdll.dll"}
输入:31信息共享
输入:32 堆栈列表参数 2 0 0
输入:33-stack-list-locals 2
输入:34 堆栈列表帧
输入:35-thread-list-ids
输入:36 数据列表寄存器值 x
            10:04:19.890

3)MSalters:我不确定您所说的“具有类类型的全局”是什么意思。出现问题的文件已包含在另一个 DLL 中,在该 DLL 中运行良好并且 DLL 加载成功。

这是 MatrixVariable.h 文件的顶部:

#include "QtSF/Variable.h" // 位于依赖 DLL(该文件始终存在的 DLL。
#include "Matrix.h" // 位于此 DLL 中的文件
#include "QList" // 这些都是来自 Qt 框架的文件
#include "QModelIndex"
#include "QItemSelection"
#include “QObject”

使用命名空间 Zenautics;
使用命名空间标准;

类 MatrixVariable:公共变量
{
    Q_OBJECT
    Q_PROPERTY(int RowCount READ rowCount WRITE setRowCount)
    Q_PROPERTY(int ColumnCount READ columnCount WRITE setColumnCount)
    Q_PROPERTY(int UndoPoints READ undoPoints WRITE setUndoPoints)

上市:
    //! 默认构造函数。
    MatrixVariable(const QString& name, int rows, int cols, double fill_real = 0, double fill_complex = 0, bool isReal = true);

等等等等等等

一种可能的解决方案是将 MatrixVariable 文件放回原始 DLL 中,但这违背了将 DLL 拆分为更小的部分的整个想法,这并不是一个真正的选择。

于 2009-04-03T08:27:51.680 回答
0

我刚刚遇到了同样的问题。一直运行良好的 dll 突然停止工作。我在初始化静态对象的 CRT 内容中遇到了访问冲突。全部重建并没有解决问题。但是当我手动注释掉所有静态时,链接器抱怨文件损坏。再次链接:工作。现在我可以加载库了。然后,我一一添加了静态数据。每次,我都重新编译并测试了一个 LoadLibrary。每次都运行良好。最终,我所有的静力学都回来了,一切正常。

如果我不得不猜测,链接器使用的一些中间文件已损坏(我看到 ilk 文件不断被 link.exe 损坏)。如果可以,也许可以清除所有文件并进行干净的构建?但我猜你已经想通了,因为这已经 6 个月大了......

于 2010-07-11T18:25:42.993 回答
0

当我最近无法从命令行 EXE 加载 DLL 时,我从 GetLastError() 收到该错误。它曾经可以工作,然后我在 DLL 中添加了一些 MFC 代码。现在所有的赌注都取消了。

于 2009-12-23T21:34:31.543 回答