1

dword(uint)を書き出すためにポインターを必要とするネイティブメソッドがあります。

ここで、(Int)ポインターから実際のuint値を取得する必要がありますが、Marshalクラスには、(符号付き)整数を読み取るための便利なメソッドしかありません。

ポインタからuint値を取得するにはどうすればよいですか?

質問(およびGoogle)を検索しましたが、必要なものが本当に見つかりませんでした。

サンプル(機能していない)コード:

IntPtr pdwSetting = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(uint)));

        try
        {
            // I'm trying to read the screen contrast here
            NativeMethods.JidaVgaGetContrast(_handleJida, pdwSetting);
            // this is not what I want, but close
            var contrast = Marshal.ReadInt32(pdwSetting);
        }
        finally
        {
            Marshal.FreeHGlobal(pdwSetting);
        }

ネイティブ関数からの戻り値は、0から255までのdwordであり、255は完全に対照的です。

4

3 に答える 3

6

usafe コードを使用できるかどうかに応じて、次のこともできます。

static unsafe void Method()
{
    IntPtr pdwSetting = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(uint)));

    try
    {
        NativeMethods.JidaVgaGetContrast(_handleJida, pdwSetting);
        var contrast = *(uint*)pdwSetting;
    }
    finally
    {
        Marshal.FreeHGlobal(pdwSetting);
    }
}

のような C++ 関数ポインタがあることに注意してください。

void (*GetContrastPointer)(HANDLE handle, unsigned int* setting);

としてマーシャリングできます

[DllImport("*.dll")]
void GetContrast(IntPtr handle, IntPtr setting); // most probably what you did

だけでなく

[DllImport("*.dll")]
void GetContrast(IntPtr handle, ref uint setting);

次のようなコードを書くことができます

uint contrast = 0; // or some other invalid value
NativeMethods.JidaVgaGetContrast(_handleJida, ref contrast);

パフォーマンスと読みやすさの両方に優れています。

于 2012-08-06T20:58:49.477 に答える
5

単純にキャストできますuint

uint contrast = (uint)Marshal.ReadInt32(pdwSetting);

例えば:

int i = -1;
uint j = (uint)i;
Console.WriteLine(j);

出力します4294967295

于 2012-08-06T20:39:50.767 に答える
0

IntPtr と型を受け取り、typeof(uint) を渡すMarshal.PtrToStructure オーバーロードを使用します。

お役に立てれば!

于 2012-08-06T13:21:27.700 に答える