0

レジストリキーに値を設定するこのP/InvokeRegSetValueExWがあります。C#で

[DllImport("coredll.dll", EntryPoint = "RegSetValueExW")]
public static extern int RegSetValueExW(uint hKey, string lpValueName,
            uint lpReserved,
            uint lpType,
            byte[] lpData,
            uint lpcbData);

4番目のparambyte[]lpdataに問題があります。値が5(int)のDWORDを渡す必要があります。文字列(REG_SZ)を渡せば、すべて問題ありません。GetBytes関数を使用して変換する必要があります。

GetBytes( "5")を呼び出すと、ASCII値53に変換されるため、レジストリ値に5ではなく53が書き込まれます。

4

3 に答える 3

2

Microsoft.Win32.RegistryKeyクラスにレジストリ値を設定するためのメソッドがすでにあるのに、なぜここでPInvokeを使用しているのかを尋ねることから始めなければなりません。または、古いバージョンのCompact Frameworkを使用して立ち往生していますか?

PInvokeに正当な理由があると仮定すると、最も簡単な答えは、整数値のPInvoke宣言をオーバーロードすることです。すなわち:

[DllImport("coredll.dll", EntryPoint = "RegSetValueExW")]
public static extern int RegSetValueExW(uint hKey, string lpValueName,
        uint lpReserved,
        uint lpType,
        ref int lpData,
        uint lpcbData);
于 2009-01-14T16:19:07.177 に答える
1

REG_SZ の代わりに REG_DWORD を使用してから、BitConverter.GetBytes(Int32) を使用して int を byte[] に変換します。

于 2009-01-14T16:23:00.117 に答える
0

整数値を渡す必要がある場合は、単純にバイトにキャストできます

byte[] lpData = new byte[] { (byte)5 };
于 2009-01-14T16:21:58.933 に答える