我在我的C ++应用程序的一个DLL中遇到了非常奇怪的行为。它工作并加载正常,直到我在DLL的主文件中使用#include包含单个文件。然后我收到此错误消息:
从D:/Targets/bin/MatrixWorkset.dll加载组件 无法加载“D:/Targets/bin/MatrixWorkset.dll”:无法加载库MatrixWorkset:对内存位置的访问无效。
现在我搜索并搜索了代码和谷歌,我无法弄清楚发生了什么。到目前为止,一切都在一个DLL中,我决定将它分成两个较小的DLL。导致问题的文件是另一个第二个库的一部分(加载正常)。
任何想法都会受到赞赏。 谢谢, 雅科
答案 0 :(得分:6)
可能的原因是具有类类型的全局。构造函数从DllMain()
运行,而DllMain()
依次在LoadLibrary()
返回之前运行。在DllMain()
返回之前,您可以执行的操作有很多限制。
答案 1 :(得分:2)
标题是否可能在某处包含#pragma comment(lib,“somelibrary.lib”)语句?如果是这样,它会自动尝试导入库。
要解决这个问题,我首先查看带有depends(http://www.dependencywalker.com/)的二进制文件,看看是否存在任何你不期望的DLL依赖项。如果您确实找到了某些内容并且您在Visual Studio中,则应在链接器上启用“显示进度”AKA / VERBOSE。
由于您获得了对内存位置的无效访问,因此DLLMAIN或某些静态初始化程序可能会崩溃。你能简化MatrixWorkset.dll(假设你写的)吗?
答案 2 :(得分:0)
您描述的错误听起来像运行时错误。这个错误是由Windows自动显示还是程序发出的?
我说将调试器附加到您的应用程序并跟踪此错误的来源。 Windows无法加载依赖项吗?你的图书馆在某种程度上是否在加载时失败了?
如果你想要输入/输出你所包含的头文件,请尝试使用和不包含这个#include预编译主源文件,并将两个结果区分开来。
答案 3 :(得分:0)
我仍然没有得到它。让我回答一些问题:
1)Windows无法加载依赖项,我认为因为Dependency Walker显示一切正常。 2)我附加了一个调试器,它在尝试加载MatrixWorkset.dll时基本上打印了以下内容:
10:04:19.234 stdout:&"warning: Loading components from D:/ScinericSoftware/VisualWorkspace/trunk/Targets/bin/MatrixWorkset.dll\n" 10:04:19.234 stdout:&"\n" status:Stopped: "signal-received" status:Stopped. 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"} input:31info shared input:32-stack-list-arguments 2 0 0 input:33-stack-list-locals 2 input:34-stack-list-frames input:35-thread-list-ids input:36-data-list-register-values x 10:04:19.890
3)MSalters:我不确定你对“全球同类型”的意思。提出问题的文件已包含在一个不同的DLL中,它可以正常工作并成功加载DLL。
这是MatrixVariable.h文件的顶部:
#include "QtSF/Variable.h" // Located in depending DLL (the DLL in which this file always lived. #include "Matrix.h" // File located in this DLL #include "QList" // These are all files from the Qt Framework #include "QModelIndex" #include "QItemSelection" #include "QObject" using namespace Zenautics; using namespace std; class MatrixVariable : public Variable { 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) public: //! Default constructor. MatrixVariable(const QString& name, int rows, int cols, double fill_real = 0, double fill_complex = 0, bool isReal = true);
等。等等。
一个可能的解决方案是将MatrixVariable文件放回到原始DLL中,但是这会破坏将DLL拆分成较小部分的整个想法,这不是一个真正的选择。
答案 4 :(得分:0)
当我最近无法从命令行EXE加载DLL时,我从GetLastError()中得到了该错误。它曾经工作,然后我添加了一些MFC代码到DLL。现在所有赌注都已关闭。
答案 5 :(得分:0)
我刚才遇到了同样的问题。一个工作得很好的dll突然停止工作了。我在初始化静态对象的CRT中接受了访问冲突。进行重建并没有解决问题。但是当我手动注释掉所有静态时,链接器抱怨文件损坏了。再次链接:工作。现在我可以LoadLibrary了。然后,我一个接一个地重新添加静态。每次,我都重新编译并测试了一个LoadLibrary。每次它工作正常。最终,我的所有静力学都回来了,事情正常。
如果我不得不猜测,链接器使用的某个中间文件已损坏(我看到链接文件不断被损坏)。如果可以的话,可能会删除所有文件并进行干净的构建?但是我猜你已经把事情弄清楚了,因为这已经是6个月了......