4

私は今日の午後、Windows Vistaを搭載した顧客のボックスでテストしていました(彼は家にいましたが、同じ結果のBusiness Editionでテストしています)。

コンピューターのハードウェアIDを取得する.DLLを使用します。使い方はとても簡単で、私が作成したサンプルプログラムは機能します。DLLはAzSdkのThisです。実際、これはWindowsXPで完全に機能します。ただし、奇妙な理由で、プロジェクト内(はるかに大きい)で、次の例外が発生します。

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

フォルダを完全に制御できるので、何が問題を引き起こしているのかわかりません。プロジェクトはac#.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で何をすべきかについてのアイデアはありますか?私が言ったように、フォルダとそのサブフォルダは「Everybody」を完全に制御できます。

更新:VistaSP1がインストールされていません。

更新2: Vista SP1をインストールしましたが、UACを無効にすると、単純なサンプルでも機能しません!!! :(くそービスタ。

4

6 に答える 6

4

DLL 'HardwareID.dll' を読み込めません: メモリ ロケーションへのアクセスが無効です。(HRESULT からの例外: 0x800703E6)

DllNotFoundException の名前は混乱を招きます。これは DLL ファイルの検索や読み込みに関する問題ではありません。問題は、DLL が読み込まれるときに不正なメモリ アクセスが行われ、読み込みプロセスが失敗することです。

ここの別のポスターのように、これは DEP の問題であり、UAC などの変更により、最終的にこのアプリケーションの DEP を無効にできるようになったと思います。

于 2008-08-27T08:51:42.953 に答える
2

@マルティン

UAC プロンプトが表示されなかった理由は、UAC がプロセスの開始方法のみを変更できるためです。プロセスが実行されたら、同じ昇格レベルにとどまる必要があります。UAC プロンプトは、次の場合に発生します。

  • Vista はこれをインストーラーと見なします (ここには多くのルールがあります。最も単純なのは、"setup.exe" という名前の場合です)。
  • 「管理者として実行」のフラグが付いている場合 (ショートカットまたは exe のプロパティを変更することで編集できます)、または
  • exe に管理者権限を要求するマニフェストが含まれている場合。

最初の 2 つのオプションは、UAC の前にあった「レガシー」アプリケーションの回避策です。新しいアプリケーションでこれを行う正しい方法は、必要な権限を要求するマニフェスト リソースを埋め込むことです。

Process Explorerなどの一部のプログラムは、実行中のプロセスを昇格させているように見えますが (この場合、ファイル メニューで [すべてのプロセスの詳細を表示] を選択すると)、実際に行うことは新しいインスタンスを開始することです。昇格 - 最初に実行されていたものではありません。これは、アプリケーションの一部のみ昇格が必要な場合に推奨される方法です (たとえば、特別な「管理オプション」ダイアログ)。

于 2008-08-27T09:30:32.920 に答える
1

コードを展開しているマシンは64ビットマシンですか?DEPの問題が発生している可能性もあります。

編集

これは、第1世代のCore Duo2Intelプロセッサを搭載した第1世代のMacbookProです。64ビットからはほど遠い。

低レベルでは32ビットから64ビットまでの構造体が適切に処理されないため、64ビットについて説明しました。マシンは64ビットではないため、DEPを無効にすることは、論理的な次のステップとして適しています。VistaはXPSP2よりも安全になりました。

さて、私はDEPをグローバルにオフにして無駄にしました。同じエラー。

また、マシンをVista SP1に更新した後、このエラーが発生することも読みました。これらのVistaインストールにはSP1がありますか?

まったく違うものであることが判明しました。テストのために、de UACを無効にしました(注:プロンプトが表示されませんでした)。

素晴らしい、私は実際にそれを提案するつもりでした、しかし私はあなたがおそらくすでにそれを試したと思いました。

于 2008-08-27T01:24:48.190 に答える
0

「すべてのユーザー」に完全な制御を許可することに加えて、その場所は中程度の整合性レベルのプロセスの書き込みも許可しますか?

どうすればそれを確認できますか? 私は Vista を初めて使います。あまり好きではありません。VM 内で日常業務を行うには遅すぎます。また、仮想マシン内で VStudio を使用するには、何も新しいものをもたらしません。

コマンド プロンプトから次のコマンドを実行できます。

icacls C:\Folder

"Mandatory Label\High Mandatory Level" などの行が表示されている場合、そのフォルダは高整合性プロセスからのみアクセスできます。そのような行がない場合、(ユーザーなどに基づいて) アクセスを拒否する他の A​​CL がなければ、中程度の整合性プロセスがそれにアクセスできます。

編集: /setintegritylevel スイッチを使用して、オブジェクトにアクセスするために必要な整合性レベルを実際に変更できることを忘れていました。

于 2008-08-27T18:57:39.173 に答える
0

ベンダーにサポート リクエストを送信しましたか? おそらく、MacBook Pro のハードウェアに製品の動作を妨げる何かがあるのでしょう。

于 2008-08-27T02:19:22.037 に答える
0

例外が DllNotFoundException であることを考えると、Vista インストールに開発ツールをインストールする前に、 Dependency Walkerで HardwareID.dll をチェックして、依存関係が実際に欠落しているかどうかを確認することをお勧めします。

于 2008-08-27T02:21:22.390 に答える