Ошибка LoadLibrary при включении определенного файла во время сборки DLL - PullRequest
4 голосов
/ 02 апреля 2009

Я получаю очень странное поведение в одной из библиотек моего приложения на C ++. Он работает и загружается нормально, пока я не включу один файл с помощью #include в основной файл DLL. Затем я получаю это сообщение об ошибке:

Загрузка компонентов из D: /Targets/bin/MatrixWorkset.dll Не удалось загрузить «D: /Targets/bin/MatrixWorkset.dll»: Невозможно загрузить библиотеку MatrixWorkset: Неверный доступ к расположению памяти.

Теперь я искал и искал по коду и Google, и я не могу понять, что происходит. До сих пор все было в одной DLL, и я решил разделить ее на две меньшие. Файл, который вызывает проблемы, является частью другой второй библиотеки (которая прекрасно загружается).

Любые идеи будут по достоинству оценены. Спасибо, Жако

Ответы [ 6 ]

6 голосов
/ 02 апреля 2009

Вероятная причина - глобальная с типом класса. Конструктор запускается из DllMain(), а DllMain(), в свою очередь, запускается до возврата LoadLibrary(). Существует множество ограничений на то, что вы можете сделать, пока не вернется DllMain().

2 голосов
/ 02 апреля 2009

Возможно ли, чтобы заголовок где-то содержал оператор комментария #pragma (lib, "somelibrary.lib")? Если это так, он автоматически пытается импортировать библиотеку.

Чтобы устранить эту проблему, я бы начал с просмотра двоичного файла с зависимостями (http://www.dependencywalker.com/),), чтобы увидеть, есть ли какие-либо зависимости от DLL, которые вы не ожидаете. Вы должны включить "Show Progress" AKA / VERBOSE на компоновщике.

Поскольку вы получаете неверный доступ к ячейке памяти, возможно, в DLLMAIN или в статическом инициализаторе происходит сбой. Можете ли вы упростить MatrixWorkset.dll (если вы это написали)?

0 голосов
/ 11 июля 2010

У меня была точно такая же проблема. DLL, которая работала очень хорошо, вдруг перестала работать. Я принимал нарушение прав доступа в материале CRT, который инициализирует статические объекты. Выполнение восстановления не решило проблему. Но когда я вручную закомментировал всю статику, компоновщик пожаловался на поврежденный файл. Ссылка еще раз: сработало. Теперь я могу загрузить библиотеку. Затем, один за другим, я снова добавил статику. Каждый раз я перекомпилировал и протестировал LoadLibrary. Каждый раз все работало нормально. В конце концов все мои статики вернулись, и все заработало нормально.

Если бы мне пришлось угадывать, какой-то промежуточный файл, используемый компоновщиком, был поврежден (я вижу, что файлы ilk постоянно портятся с помощью link.exe). Если вы можете, может быть, уничтожить все ваши файлы и сделать чистую сборку? Но я предполагаю, что вы уже разобрались, так как это 6 месяцев ...

0 голосов
/ 24 декабря 2009

Я получаю эту ошибку от GetLastError (), когда мне не удается загрузить DLL из командной строки EXE недавно. Раньше все работало, потом я добавил немного кода MFC в DLL. Теперь все ставки сняты.

0 голосов
/ 03 апреля 2009

Я все еще не понимаю. Позвольте мне ответить на некоторые из заданных вопросов:

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 на более мелкие части, что на самом деле не вариант.

0 голосов
/ 02 апреля 2009

Ошибка, которую вы описываете, звучит как ошибка времени выполнения. Эта ошибка автоматически отображается в Windows или это ваша программа?

Я говорю: присоедините отладчик к вашему приложению и проследите, откуда возникла эта ошибка. Windows не может загрузить зависимость? Ваша библиотека как-то перестала работать при загрузке?

Если вы хотите исключить / включить этот заголовочный файл, который вы включаете, попробуйте предварительно скомпилировать ваш основной исходный файл как с #include, так и без него, и отразите два результата.

...