3

VisualStudio2012のコード分析ツールからこの警告が表示されます。コードは次のようになります。

using System;
using System.Runtime.InteropServices;

namespace MyProgramNamespace
{
    class NativeMethods
    {
        [DllImport("user32.dll", EntryPoint = "GetWindowLongPtr")]
        public static extern IntPtr GetWindowLongPtr(IntPtr handle, int flag);

        [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr")]
        public static extern IntPtr SetWindowLongPtr(IntPtr handle, int flag, IntPtr ownerHandle);
    }
}

私はx64のみをコンパイルしているので、古いGetWindowLongとSetWindowLongの使用には関心がありません。これらのエントリポイント名は、私が知る限り正しいものです。

編集:解決済み。問題は、Visual Studio自体(したがってコード分析ツール)が32ビットであるということです。コード分​​析ツールがuser32.dllをチェックして、それらの関数が存在するかどうかを確認すると、プログラムが実際に使用するバージョン(64ビットバージョン)ではなく、32ビットバージョンのuser32.dll(C:/ Windows / SysWOW64 /内)をチェックします。 C:/ Windows / System32)で、これらの関数は64ビットバージョンにのみ存在します(32ビットバージョンはGetWindowLongPtr/SetWindowLongPtrの代わりにGetWindowLong/SetWindowLongを使用します(PTR部分に注意してください))。

4

3 に答える 3

1

それらが機能しない理由はEntryPoint =、DllImport属性で指定することにより、マーシャラーに「これは私が呼び出してほしい正確な関数です」と伝えているためです。

GetWindowLongPtruser32.dllで呼び出される関数はありません。ありGetWindowLongPtrAますGetWindowLongPtrW

を省略するEntryPoint=と、マーシャラーは実行中のOSに基づいてどちらか一方を呼び出します。

したがって、それを省略するか、AまたはWバージョンを指定してください。AまたはWを指定する場合はCharSet=CharSet.Ansi、AバージョンまたはCharSet=CharSet.UnicodeWバージョンも指定する必要があります。

于 2012-10-30T21:19:46.683 に答える
1

(この回答は、元の質問の下部にある編集にも投稿されており、人々がすばやく簡単に見つけられるようになっています)

問題は、Visual Studio自体(したがってコード分析ツール)が32ビットであるということです。コード分​​析ツールがuser32.dllをチェックして、それらの関数が存在するかどうかを確認すると、プログラムが実際に使用するバージョン(64ビットバージョン)ではなく、32ビットバージョンのuser32.dll(C:/ Windows / SysWOW64 /内)をチェックします。 C:/ Windows / System32)で、これらの関数は64ビットバージョンにのみ存在します(32ビットバージョンはGetWindowLongPtr/SetWindowLongPtrの代わりにGetWindowLong/SetWindowLongを使用します(PTR部分に注意してください))。

于 2012-11-21T17:56:57.563 に答える
0

次のことを試してください。

    [DllImport("user32.dll", EntryPoint = "GetWindowLongPtrW")]
    public static extern IntPtr GetWindowLongPtr(IntPtr handle, int flag);

    [DllImport("user32.dll", EntryPoint = "SetWindowLongPtrW")]
    public static extern IntPtr SetWindowLongPtr(IntPtr handle, int flag, IntPtr ownerHandle);
于 2012-10-30T21:11:28.280 に答える