Windows Vista:DLL「x.dll」をロードできません:メモリ位置への無効なアクセスです。(DllNotFoundException)
-
09-06-2019 - |
質問
今日の午後、私は Windows Vista を搭載した顧客のボックスでテストしていました (顧客は自宅にいましたが、Business Edition でテストしていますが、同じ結果が得られました)。
コンピューターのハードウェア ID を取得する .DLL を使用します。使い方は非常に簡単で、私が作成したサンプルプログラムも動作します。DLLは これはAzSdkからのものです. 。実際、これは Windows XP では完全に機能します。ただし、何らかの奇妙な理由で、プロジェクト (はるかに大きい) 内で次の例外が発生します。
Exception Type: System.DllNotFoundException
Exception Message: Unable to load DLL 'HardwareID.dll': Invalid access to memory location. (Exception from HRESULT: 0x800703E6)
Exception Target Site: GetHardwareID
私はフォルダーを完全に制御できるので、問題の原因がわかりません。このプロジェクトは c#.net Windows フォーム アプリケーションであり、外部ライブラリの呼び出しを除いてすべてが正常に動作します。
私は次のように宣言しています。(注記:その ない COM ライブラリなので登録する必要はありません)。
[DllImport("HardwareID.dll")]
public static extern String GetHardwareID(bool HDD,
bool NIC, bool CPU, bool BIOS, string sRegistrationCode);
そして、呼び出しコードは非常に単純です。
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = GetHardwareID(cb_HDD.Checked,
cb_NIC.Checked,
cb_CPU.Checked,
cb_BIOS.Checked,
"*Registration Code*");
}
サンプル アプリケーションを作成すると動作しますが、私のプロジェクト内では動作しません。XPでは正常に動作します。これを機能させるために Vista で何をすべきかについて何かアイデアはありますか?すでに述べたように、フォルダーとそのサブフォルダーには「Everyone」に対するフル コントロールがあります。
アップデート: Vista SP 1 がインストールされていません。
更新 2: Vista SP1 をインストールしましたが、UAC が無効になっているため、単純なサンプルですら動作しません。:( くそー、ビスタ。
解決
UAC プロンプトが表示されない理由は、UAC がプロセスの変更方法のみを変更できるためです。 始めました, 、プロセスが実行されると、同じ昇格レベルを維持する必要があります。UAC は次の場合にプロンプトを表示します。
- Vista はそれがインストーラーであると認識します (ここにはたくさんのルールがあります, 、最も単純なものは「setup.exe」という名前の場合です)、
- 「管理者として実行」としてフラグが設定されている場合 (これは、ショートカットまたは実行ファイルのプロパティを変更することで編集できます)、または
- exe に管理者権限を要求するマニフェストが含まれている場合。
最初の 2 つのオプションは、UAC 以前に存在した「レガシー」アプリケーションに対する回避策です。新しいアプリケーションに対してこれを行う正しい方法は、次のとおりです。 マニフェストリソースを埋め込む 必要な権限を要求します。
いくつかのプログラム、例えば プロセスエクスプローラー 実行中のプロセスを昇格させるように見えますが (この場合、ファイル メニューで [すべてのプロセスの詳細を表示] を選択した場合)、実際に行うのは新しいインスタンスの開始であり、昇格されるのはその新しいインスタンスであり、以前のインスタンスではありません。もともと走っている。これは、アプリケーションの一部の部分のみを昇格する必要がある場合に推奨される方法です (例:特別な「管理者オプション」ダイアログ)。
他のヒント
DLL「HardwareID.dll」をロードできません:メモリ位置への無効なアクセスです。(HRESULT からの例外:0x800703E6)
DllNotFoundException の名前が混乱を招く可能性があります。これは DLL ファイルの検索やロードの問題ではありません。問題は、DLL のロード時に不正なメモリ アクセスが行われ、ロード プロセスが失敗することです。
ここの別の投稿者と同様に、これは DEP の問題であり、UAC などの変更により、最終的にこのアプリケーションの DEP を無効にできるようになったと思います。
コードがデプロイされているマシンは 64 ビット マシンですか?また、次のような問題に遭遇する可能性もあります。 DEP 問題。
編集
これは、第 1 世代 Core Duo 2 Intel プロセッサーを搭載した第 1 世代 Macbook Pro です。64ビットにはほど遠い。
64 ビットについて言及したのは、低レベルでは 32 ビットから 64 ビットの構造体が適切に処理されないためです。マシンは 64 ビットではないため、次のステップとしては DEP を無効にするのが論理的です。Vista は XP SP2 よりも安全になりました。
さて、DEP をグローバルにオフにしましたが、役に立ちませんでした。同じエラーです。
そうですね、マシンを Vista SP1 にアップデートした後にこのエラーが発生したという記事も読みました。これらの Vista インストールには SP1 が含まれていますか?
まったく別のものであることがわかります。テストのため、UAC を無効にしました (注:プロンプトが表示されませんでした)。
そうですね、本当はそれを提案しようと思っていましたが、おそらくすでに試しているのではないかと思いました。
ベンダーにサポートをリクエストしましたか?おそらく、MacBook Pro のハードウェアに製品の動作を妨げる何かがある可能性があります。
例外が DllNotFoundException であることを考えると、HardwareID.dll を次のようにチェックしてみるとよいでしょう。 依存関係ウォーカー Vista インストールに開発ツールをインストールする前に、実際に不足している依存関係があるかどうかを確認してください。
「Everyone」にフル コントロールを許可することに加えて、その場所では中程度の整合性レベルのプロセスによる書き込みも許可されますか?
それを確認するにはどうすればよいですか?私は Vista を初めて使用します。あまり好きではありません。毎日の作業や仮想マシン内での VStudio の使用には、VM 内では遅すぎます。新しいことは何もありません。
コマンド プロンプトから次を実行できます。
icacls C:\Folder
「Mandatory Label\High Mandatory Level」のような行が表示されている場合、そのフォルダーには整合性の高いプロセスのみがアクセスできます。そのような行がない場合、(たとえばユーザーに基づいて) アクセスを拒否する他の ACL がない限り、中程度の整合性プロセスはその行にアクセスできます。
編集:言い忘れていましたが、/setintegritylevel スイッチを使用すると、オブジェクトにアクセスするために必要な整合性レベルを実際に変更できます。