4

C++ アプリの DLL の 1 つで、非常に奇妙な動作が発生します。DLL のメイン ファイルに #include を使用して 1 つのファイルを含めるまで、正常に動作し、正常に読み込まれます。次に、次のエラー メッセージが表示されます。

D:/Targets/bin/MatrixWorkset.dll からコンポーネントを読み込んでいます "D:/Targets/bin/MatrixWorkset.dll" を読み込めませんでした: ライブラリ MatrixWorkset を読み込めません: メモリ ロケーションへのアクセスが無効です。

今、私はコードとグーグルを検索して検索しましたが、何が起こっているのかわかりません。これまではすべてが 1 つの DLL に含まれていましたが、それを 2 つの小さな DLL に分割することにしました。問題の原因となっているファイルは、他の 2 番目のライブラリ (問題なくロードされます) の一部です。

どんなアイデアでも大歓迎です。ありがとう、ジャコ

4

6 に答える 6

6

考えられる原因は、クラス タイプを持つグローバルです。コンストラクターは から実行されDllMain()、リターンDllMain()の前に実行されLoadLibrary()ます。DllMain()が戻るまでにできることにはかなりの制限があります。

于 2009-04-02T13:55:41.377 に答える
2

ヘッダーに #pragma comment(lib,"somelibrary.lib") ステートメントが含まれている可能性はありますか? その場合、自動的にライブラリをインポートしようとしています。

これをトラブルシューティングするには、依存関係のあるバイナリ ( http://www.dependencywalker.com/ ) を調べて、予期しない DLL 依存関係があるかどうかを確認します。何かが見つかり、Visual Studio を使用している場合は、リンカーで "Show Progress" AKA /VERBOSE をオンにする必要があります。

Invalid Access to memory location を取得しているため、DLLMAIN またはクラッシュしている静的初期化子に何かがある可能性があります。MatrixWorkset.dll を単純化できますか (自分で作成したと仮定して)。

于 2009-04-02T12:45:59.097 に答える
0

説明するエラーは、実行時エラーのように聞こえます。このエラーはウィンドウによって自動的に表示されますか、それともプログラムが発するエラーですか?

アプリケーションにデバッガーを接続して、このエラーの原因を追跡します。Windowsは依存関係の読み込みに失敗していますか?あなたのライブラリはどういうわけかロードアップに失敗していますか?

インクルードするこのヘッダーファイルを除外/除外する場合は、この#includeを使用する場合と使用しない場合の両方で、メインソースファイルをプリコンパイルして、2つの結果を比較してみてください。

于 2009-04-02T18:15:34.677 に答える
0

最近、コマンド ライン EXE から DLL をロードできなかったときに、GetLastError() からそのエラーが発生します。以前は機能していましたが、MFC コードを DLL に追加しました。今、すべての賭けはオフです。

于 2009-12-23T21:34:31.543 に答える
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
stdout:&"\n"
status:Stopped: "signal-received"
状態:停止中。
            10:04:19.890
stdout:30*stopped,reason="signal-received",signal-name="SIGSEGV",signal-meaning="Segmentation fault",thread-id="1",frame={addr="0x7c919994",func= "tolower",args=[],from="C:\\WINDOWS\\system32\\ntdll.dll"}
入力:31情報共有
入力: 32-スタック リスト引数 2 0 0
input:33-stack-list-locals 2
入力: 34 スタック リスト フレーム
入力:35 スレッド リスト ID
入力:36 データリストレジスタ値 x
            10:04:19.890

3) MSalters: 「クラス タイプを持つグローバル」とはどういう意味かわかりません。問題を引き起こしているファイルは別の DLL に含まれており、正常に動作し、DLL は正常にロードされました。

これは、MatrixVariable.h ファイルの先頭です。

#include "QtSF/Variable.h" // 依存する DLL (このファイルが常に存在する DLL.
#include "Matrix.h" // この DLL にあるファイル
#include "QList" // これらはすべて Qt フレームワークのファイルです
#include "QModelIndex"
#include "QItemSelection"
#include "QObject"

名前空間 Zenautics を使用します。
名前空間 std を使用します。

class MatrixVariable : public 変数
{
    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 を実行できます。次に、1 つずつ、静的を追加し直しました。そのたびに、LoadLibrary を再コンパイルしてテストしました。毎回うまくいきました。最終的に、すべてのスタティックが元に戻り、正常に動作しました。

推測するに、リンカーが使用する中間ファイルの一部が破損していました (link.exe によって ilk ファイルが常に破損していることがわかります)。可能であれば、すべてのファイルを消去してクリーン ビルドを実行してみてはいかがでしょうか。しかし、これは生後6か月なので、あなたはすでに物事を理解していると思います...

于 2010-07-11T18:25:42.993 に答える